Not logged in
Hex Artifact Content

Artifact a4fda8e4660df972544386d3070d70533fb92772:

  • File scripts/svgml.tcl — part of check-in [0b441a3625] at 2019-12-03 17:50:49 on branch trunk — * correcting details in svgml tcl * finished implementation in svgml c (user: ramsan size: 88211)

0000: 0d 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ..package requir
0010: 65 20 63 6f 6d 70 61 73 73 5f 75 74 69 6c 73 3a  e compass_utils:
0020: 3a 6d 61 74 68 0d 0a 70 61 63 6b 61 67 65 20 72  :math..package r
0030: 65 71 75 69 72 65 20 6d 61 74 68 3a 3a 6c 69 6e  equire math::lin
0040: 65 61 72 61 6c 67 65 62 72 61 0d 0a 70 61 63 6b  earalgebra..pack
0050: 61 67 65 20 72 65 71 75 69 72 65 20 63 6f 6d 70  age require comp
0060: 61 73 73 5f 75 74 69 6c 73 0d 0a 0d 0a 6e 61 6d  ass_utils....nam
0070: 65 73 70 61 63 65 20 65 76 61 6c 20 6d 20 7b 0d  espace eval m {.
0080: 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
0090: 6d 70 6f 72 74 20 2d 66 6f 72 63 65 20 3a 3a 6d  mport -force ::m
00a0: 61 74 68 3a 3a 6c 69 6e 65 61 72 61 6c 67 65 62  ath::linearalgeb
00b0: 72 61 3a 3a 2a 0d 0a 7d 0d 0a 0d 0a 6e 61 6d 65  ra::*..}....name
00c0: 73 70 61 63 65 20 65 76 61 6c 20 73 76 67 6d 6c  space eval svgml
00d0: 20 7b 0d 0a 0d 0a 7d 0d 0a 0d 0a 23 20 70 61 63   {....}....# pac
00e0: 6b 61 67 65 20 72 65 20 63 6f 6d 70 61 73 73 5f  kage re compass_
00f0: 75 74 69 6c 73 3a 3a 69 6d 67 0d 0a 23 20 63 75  utils::img..# cu
0100: 3a 3a 69 6d 67 3a 3a 63 6c 69 70 62 6f 61 72 64  ::img::clipboard
0110: 20 67 65 74 20 2d 74 79 70 65 20 69 6d 61 67 65   get -type image
0120: 2f 78 2d 69 6e 6b 73 63 61 70 65 2d 73 76 67 0d  /x-inkscape-svg.
0130: 0a 0d 0a 23 20 67 69 64 5f 67 72 6f 75 70 73 5f  ...# gid_groups_
0140: 63 6f 6e 64 73 3a 3a 61 70 70 6c 79 5f 63 6f 6e  conds::apply_con
0150: 64 69 74 69 6f 6e 20 7b 20 61 72 67 73 20 7d 20  dition { args } 
0160: 7b 0d 0a 23 20 20 20 20 20 76 61 72 69 61 62 6c  {..#     variabl
0170: 65 20 64 6f 63 0d 0a 23 20 20 20 20 20 0d 0a 23  e doc..#     ..#
0180: 20 20 20 20 20 73 65 74 20 6f 70 74 69 6f 6e 61       set optiona
0190: 6c 20 7b 0d 0a 23 20 20 20 20 20 20 20 20 20 7b  l {..#         {
01a0: 20 2d 6f 76 20 70 6f 69 6e 74 7c 6c 69 6e 65 7c   -ov point|line|
01b0: 73 75 72 66 61 63 65 7c 76 6f 6c 75 6d 65 20 22  surface|volume "
01c0: 22 20 7d 0d 0a 23 20 20 20 20 20 20 20 20 20 7b  " }..#         {
01d0: 20 2d 6e 6f 61 63 74 75 61 6c 69 7a 65 67 72 6f   -noactualizegro
01e0: 75 70 73 20 22 22 20 30 20 7d 0d 0a 23 20 20 20  ups "" 0 }..#   
01f0: 20 20 7d 0d 0a 23 20 20 20 20 20 73 65 74 20 63    }..#     set c
0200: 6f 6d 70 75 6c 73 6f 72 79 20 22 78 70 61 74 68  ompulsory "xpath
0210: 43 6e 64 20 67 72 6f 75 70 5f 6e 61 6d 65 20 76  Cnd group_name v
0220: 61 6c 75 65 73 5f 64 69 63 74 22 0d 0a 23 20 7d  alues_dict"..# }
0230: 0d 0a 23 20 73 65 74 20 6e 31 20 7b 63 6f 6e 74  ..# set n1 {cont
0240: 61 69 6e 65 72 5b 40 6e 3d 27 50 72 6f 70 65 72  ainer[@n='Proper
0250: 74 69 65 73 27 5d 2f 63 6f 6e 74 61 69 6e 65 72  ties']/container
0260: 5b 40 6e 3d 27 53 68 65 6c 6c 73 27 5d 2f 63 6f  [@n='Shells']/co
0270: 6e 64 69 74 69 6f 6e 5b 40 6e 3d 27 49 73 6f 74  ndition[@n='Isot
0280: 72 6f 70 69 63 5f 53 68 65 6c 6c 27 5d 7d 0d 0a  ropic_Shell']}..
0290: 23 20 73 65 74 20 6e 32 20 7b 63 6f 6e 74 61 69  # set n2 {contai
02a0: 6e 65 72 5b 40 6e 3d 27 43 6f 6e 64 69 74 69 6f  ner[@n='Conditio
02b0: 6e 73 27 5d 2f 63 6f 6e 74 61 69 6e 65 72 5b 40  ns']/container[@
02c0: 6e 3d 27 43 6f 6e 73 74 72 61 69 6e 74 73 27 5d  n='Constraints']
02d0: 2f 63 6f 6e 64 69 74 69 6f 6e 5b 40 6e 3d 27 46  /condition[@n='F
02e0: 69 78 65 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73  ixed_constraints
02f0: 27 5d 7d 0d 0a 23 20 73 65 74 20 6e 33 20 7b 63  ']}..# set n3 {c
0300: 6f 6e 74 61 69 6e 65 72 5b 40 6e 3d 27 6c 6f 61  ontainer[@n='loa
0310: 64 63 61 73 65 73 27 5d 2f 62 6c 6f 63 6b 64 61  dcases']/blockda
0320: 74 61 5b 40 6e 3d 27 6c 6f 61 64 63 61 73 65 27  ta[@n='loadcase'
0330: 5d 5b 31 5d 2f 63 6f 6e 74 61 69 6e 65 72 5b 40  ][1]/container[@
0340: 6e 3d 27 53 68 65 6c 6c 73 27 5d 2f 63 6f 6e 64  n='Shells']/cond
0350: 69 74 69 6f 6e 5b 40 6e 3d 27 53 65 6c 66 5f 77  ition[@n='Self_w
0360: 65 69 67 68 74 5f 73 68 65 6c 6c 27 5d 7d 0d 0a  eight_shell']}..
0370: 23 20 0d 0a 23 20 3c 67 69 64 70 6f 73 74 5f 62  # ..# <gidpost_b
0380: 61 74 63 68 20 76 65 72 73 69 6f 6e 3d 27 31 2e  atch version='1.
0390: 30 27 3e 0d 0a 23 20 3c 61 20 6e 3d 22 63 72 65  0'>..# <a n="cre
03a0: 61 74 65 5f 6c 69 6e 65 22 20 61 3d 22 6c 69 6e  ate_line" a="lin
03b0: 65 20 7b 7b 7b 7d 20 30 2e 30 20 30 2e 30 20 30  e {{{} 0.0 0.0 0
03c0: 2e 30 7d 20 7b 7b 7d 20 35 20 30 2e 30 20 30 2e  .0} {{} 5 0.0 0.
03d0: 30 7d 20 7b 7b 63 6f 6f 72 64 73 5f 74 79 70 65  0} {{coords_type
03e0: 20 7b 72 65 6c 61 74 69 76 65 20 7b 30 2e 30 20   {relative {0.0 
03f0: 31 20 30 2e 30 7d 7d 7d 7d 20 7b 7b 63 6f 6f 72  1 0.0}}}} {{coor
0400: 64 73 5f 74 79 70 65 20 7b 72 65 6c 61 74 69 76  ds_type {relativ
0410: 65 20 7b 2d 35 20 30 2e 30 20 30 2e 30 7d 7d 7d  e {-5 0.0 0.0}}}
0420: 7d 20 7b 7b 63 6f 6f 72 64 73 5f 74 79 70 65 20  } {{coords_type 
0430: 63 6c 6f 73 65 7d 20 30 2e 30 20 30 2e 30 20 30  close} 0.0 0.0 0
0440: 2e 30 7d 7d 22 20 66 3d 22 31 22 2f 3e 0d 0a 23  .0}}" f="1"/>..#
0450: 20 3c 61 20 6e 3d 27 63 72 65 61 74 65 5f 73 75   <a n='create_su
0460: 72 66 61 63 65 27 20 61 3d 27 62 79 5f 63 6f 6e  rface' a='by_con
0470: 74 6f 75 72 20 7b 6c 61 73 74 2d 33 20 6c 61 73  tour {last-3 las
0480: 74 2d 32 20 6c 61 73 74 2d 31 20 6c 61 73 74 7d  t-2 last-1 last}
0490: 27 2f 3e 0d 0a 23 20 0d 0a 23 20 3c 61 20 6e 3d  '/>..# ..# <a n=
04a0: 22 73 74 61 72 74 5f 67 72 6f 75 70 22 20 61 3d  "start_group" a=
04b0: 22 22 20 66 3d 22 22 2f 3e 0d 0a 23 20 3c 61 20  "" f=""/>..# <a 
04c0: 6e 3d 27 63 72 65 61 74 65 5f 67 72 6f 75 70 27  n='create_group'
04d0: 20 61 3d 27 2d 6d 61 6b 65 5f 6e 61 6d 65 5f 75   a='-make_name_u
04e0: 6e 69 71 75 65 20 31 20 7b 4e 61 6d 65 20 7b 49  nique 1 {Name {I
04f0: 73 6f 74 72 6f 70 69 63 20 73 68 65 6c 6c 20 41  sotropic shell A
0500: 75 74 6f 7d 7d 27 20 66 3d 27 31 27 2f 3e 0d 0a  uto}}' f='1'/>..
0510: 23 20 3c 61 20 6e 3d 27 61 64 64 5f 67 72 6f 75  # <a n='add_grou
0520: 70 5f 65 6e 74 69 74 69 65 73 27 20 61 3d 27 7b  p_entities' a='{
0530: 49 73 6f 74 72 6f 70 69 63 20 73 68 65 6c 6c 20  Isotropic shell 
0540: 41 75 74 6f 7d 20 7b 73 75 72 66 61 63 65 20 6c  Auto} {surface l
0550: 61 73 74 7d 27 20 66 3d 27 31 27 2f 3e 0d 0a 23  ast}' f='1'/>..#
0560: 20 0d 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f 67   ..# <a n="gid_g
0570: 72 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64 64  roups_conds::add
0580: 46 22 20 61 3d 22 7b 24 6e 31 7d 20 67 72 6f 75  F" a="{$n1} grou
0590: 70 20 7b 6e 20 7b 49 73 6f 74 72 6f 70 69 63 20  p {n {Isotropic 
05a0: 73 68 65 6c 6c 20 41 75 74 6f 7d 7d 22 20 66 3d  shell Auto}}" f=
05b0: 22 31 22 2f 3e 0d 0a 23 20 3c 61 20 6e 3d 22 67  "1"/>..# <a n="g
05c0: 69 64 5f 67 72 6f 75 70 73 5f 63 6f 6e 64 73 3a  id_groups_conds:
05d0: 3a 61 64 64 46 22 20 61 3d 22 7b 24 6e 31 2f 67  :addF" a="{$n1/g
05e0: 72 6f 75 70 5b 40 6e 3d 27 49 73 6f 74 72 6f 70  roup[@n='Isotrop
05f0: 69 63 20 73 68 65 6c 6c 20 41 75 74 6f 27 5d 7d  ic shell Auto']}
0600: 20 76 61 6c 75 65 20 7b 6e 20 54 68 69 63 6b 6e   value {n Thickn
0610: 65 73 73 20 70 6e 20 54 68 69 63 6b 6e 65 73 73  ess pn Thickness
0620: 20 75 6e 69 74 5f 6d 61 67 6e 69 74 75 64 65 20   unit_magnitude 
0630: 4c 20 73 74 61 74 65 20 7b 5b 63 68 65 63 6b 5f  L state {[check_
0640: 73 74 61 74 65 20 7b 42 65 61 6d 73 5f 73 68 65  state {Beams_she
0650: 6c 6c 73 20 53 68 65 6c 6c 73 20 50 6c 61 6e 65  lls Shells Plane
0660: 5f 73 74 72 65 73 73 20 50 6c 61 74 65 73 20 42  _stress Plates B
0670: 65 61 6d 73 5f 73 68 65 6c 6c 73 5f 73 6f 6c 69  eams_shells_soli
0680: 64 73 20 41 6c 6c 7d 5d 7d 20 76 20 30 2e 30 20  ds All}]} v 0.0 
0690: 75 6e 69 74 73 20 6d 7d 22 20 66 3d 22 31 22 2f  units m}" f="1"/
06a0: 3e 0d 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f 67  >..# <a n="gid_g
06b0: 72 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64 64  roups_conds::add
06c0: 46 22 20 61 3d 22 7b 24 6e 31 2f 67 72 6f 75 70  F" a="{$n1/group
06d0: 5b 40 6e 3d 27 49 73 6f 74 72 6f 70 69 63 20 73  [@n='Isotropic s
06e0: 68 65 6c 6c 20 41 75 74 6f 27 5d 7d 20 76 61 6c  hell Auto']} val
06f0: 75 65 20 7b 6e 20 4d 61 74 65 72 69 61 6c 20 70  ue {n Material p
0700: 6e 20 4d 61 74 65 72 69 61 6c 20 65 64 69 74 61  n Material edita
0710: 62 6c 65 20 30 20 76 61 6c 75 65 73 5f 74 72 65  ble 0 values_tre
0720: 65 20 7b 5b 67 69 76 65 5f 6d 61 74 65 72 69 61  e {[give_materia
0730: 6c 73 5f 6c 69 73 74 20 2d 6e 6f 5f 68 61 73 5f  ls_list -no_has_
0740: 63 6f 6e 74 61 69 6e 65 72 20 6d 61 74 65 72 69  container materi
0750: 61 6c 5f 61 6e 69 73 6f 74 72 6f 70 69 63 5f 65  al_anisotropic_e
0760: 6c 61 73 74 69 63 20 2d 68 61 73 5f 73 75 70 72  lastic -has_supr
0770: 61 5f 63 6f 6e 74 61 69 6e 65 72 20 53 74 72 75  a_container Stru
0780: 63 74 75 72 61 6c 5d 7d 20 73 74 61 74 65 20 7b  ctural]} state {
0790: 7d 20 76 20 7b 53 74 65 65 6c 20 53 2d 33 35 35  } v {Steel S-355
07a0: 4e 7d 7d 22 20 66 3d 22 31 22 2f 3e 0d 0a 23 20  N}}" f="1"/>..# 
07b0: 3c 61 20 6e 3d 22 67 69 64 5f 67 72 6f 75 70 73  <a n="gid_groups
07c0: 5f 63 6f 6e 64 73 3a 3a 61 64 64 46 22 20 61 3d  _conds::addF" a=
07d0: 22 7b 24 6e 31 2f 67 72 6f 75 70 5b 40 6e 3d 27  "{$n1/group[@n='
07e0: 49 73 6f 74 72 6f 70 69 63 20 73 68 65 6c 6c 20  Isotropic shell 
07f0: 41 75 74 6f 27 5d 7d 20 76 61 6c 75 65 20 7b 6e  Auto']} value {n
0800: 20 45 20 70 6e 20 45 20 68 65 6c 70 20 7b 59 6f   E pn E help {Yo
0810: 75 6e 67 20 6d 6f 64 75 6c 75 73 7d 20 75 6e 69  ung modulus} uni
0820: 74 5f 6d 61 67 6e 69 74 75 64 65 20 50 20 73 74  t_magnitude P st
0830: 61 74 65 20 7b 7d 20 76 20 32 2e 31 65 31 31 20  ate {} v 2.1e11 
0840: 75 6e 69 74 73 20 4e 2f 6d 5e 32 7d 22 20 66 3d  units N/m^2}" f=
0850: 22 31 22 2f 3e 0d 0a 23 20 3c 61 20 6e 3d 22 67  "1"/>..# <a n="g
0860: 69 64 5f 67 72 6f 75 70 73 5f 63 6f 6e 64 73 3a  id_groups_conds:
0870: 3a 61 64 64 46 22 20 61 3d 22 7b 24 6e 31 2f 67  :addF" a="{$n1/g
0880: 72 6f 75 70 5b 40 6e 3d 27 49 73 6f 74 72 6f 70  roup[@n='Isotrop
0890: 69 63 20 73 68 65 6c 6c 20 41 75 74 6f 27 5d 7d  ic shell Auto']}
08a0: 20 76 61 6c 75 65 20 7b 6e 20 6e 75 20 70 6e 20   value {n nu pn 
08b0: 7b 5c 75 30 33 62 64 7d 20 68 65 6c 70 20 7b 50  {\u03bd} help {P
08c0: 6f 69 73 73 6f 6e 20 63 6f 65 66 66 69 63 69 65  oisson coefficie
08d0: 6e 74 7d 20 73 74 72 69 6e 67 5f 69 73 20 64 6f  nt} string_is do
08e0: 75 62 6c 65 20 73 74 61 74 65 20 7b 7d 20 76 20  uble state {} v 
08f0: 30 2e 33 7d 22 20 66 3d 22 31 22 2f 3e 0d 0a 23  0.3}" f="1"/>..#
0900: 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72 6f 75 70   <a n="gid_group
0910: 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46 22 20 61  s_conds::addF" a
0920: 3d 22 7b 24 6e 31 2f 67 72 6f 75 70 5b 40 6e 3d  ="{$n1/group[@n=
0930: 27 49 73 6f 74 72 6f 70 69 63 20 73 68 65 6c 6c  'Isotropic shell
0940: 20 41 75 74 6f 27 5d 7d 20 76 61 6c 75 65 20 7b   Auto']} value {
0950: 6e 20 53 70 65 63 69 66 69 63 5f 77 65 69 67 68  n Specific_weigh
0960: 74 20 70 6e 20 7b 53 70 65 63 69 66 69 63 20 77  t pn {Specific w
0970: 65 69 67 68 74 7d 20 75 6e 69 74 5f 6d 61 67 6e  eight} unit_magn
0980: 69 74 75 64 65 20 46 2f 4c 5e 33 20 73 74 61 74  itude F/L^3 stat
0990: 65 20 7b 7d 20 76 20 37 36 39 33 30 20 75 6e 69  e {} v 76930 uni
09a0: 74 73 20 4e 2f 6d 5e 33 7d 22 20 66 3d 22 31 22  ts N/m^3}" f="1"
09b0: 2f 3e 0d 0a 23 20 3c 61 20 6e 3d 22 63 68 61 6e  />..# <a n="chan
09c0: 67 65 5f 67 72 6f 75 70 5f 70 72 6f 70 65 72 74  ge_group_propert
09d0: 69 65 73 22 20 61 3d 22 7b 7b 49 73 6f 74 72 6f  ies" a="{{Isotro
09e0: 70 69 63 20 73 68 65 6c 6c 20 41 75 74 6f 7d 7d  pic shell Auto}}
09f0: 20 74 79 70 65 20 42 43 22 20 66 3d 22 31 22 2f   type BC" f="1"/
0a00: 3e 0d 0a 23 20 3c 61 20 6e 3d 22 65 6e 64 5f 67  >..# <a n="end_g
0a10: 72 6f 75 70 22 20 70 6e 3d 22 22 20 61 3d 22 22  roup" pn="" a=""
0a20: 20 66 3d 22 22 2f 3e 0d 0a 23 20 0d 0a 23 20 3c   f=""/>..# ..# <
0a30: 61 20 6e 3d 22 67 69 64 5f 67 72 6f 75 70 73 5f  a n="gid_groups_
0a40: 63 6f 6e 64 73 3a 3a 61 64 64 46 22 20 61 3d 22  conds::addF" a="
0a50: 7b 24 6e 32 7d 20 67 72 6f 75 70 20 7b 6e 20 7b  {$n2} group {n {
0a60: 46 69 78 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  Fixed constraint
0a70: 73 20 41 75 74 6f 32 7d 20 6f 76 20 70 6f 69 6e  s Auto2} ov poin
0a80: 74 7d 22 20 66 3d 22 31 22 2f 3e 0d 0a 23 20 3c  t}" f="1"/>..# <
0a90: 61 20 6e 3d 22 67 69 64 5f 67 72 6f 75 70 73 5f  a n="gid_groups_
0aa0: 63 6f 6e 64 73 3a 3a 61 64 64 46 22 20 61 3d 22  conds::addF" a="
0ab0: 7b 24 6e 32 2f 67 72 6f 75 70 5b 40 6e 3d 27 46  {$n2/group[@n='F
0ac0: 69 78 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73  ixed constraints
0ad0: 20 41 75 74 6f 32 27 5d 7d 20 63 6f 6e 74 61 69   Auto2']} contai
0ae0: 6e 65 72 20 7b 6e 20 41 63 74 69 76 61 74 69 6f  ner {n Activatio
0af0: 6e 20 70 6e 20 41 63 74 69 76 61 74 69 6f 6e 7d  n pn Activation}
0b00: 22 20 66 3d 22 31 22 2f 3e 0d 0a 23 20 3c 61 20  " f="1"/>..# <a 
0b10: 6e 3d 22 67 69 64 5f 67 72 6f 75 70 73 5f 63 6f  n="gid_groups_co
0b20: 6e 64 73 3a 3a 61 64 64 46 22 20 61 3d 22 7b 24  nds::addF" a="{$
0b30: 6e 32 2f 67 72 6f 75 70 5b 40 6e 3d 27 46 69 78  n2/group[@n='Fix
0b40: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 41  ed constraints A
0b50: 75 74 6f 32 27 5d 2f 63 6f 6e 74 61 69 6e 65 72  uto2']/container
0b60: 5b 40 6e 3d 27 41 63 74 69 76 61 74 69 6f 6e 27  [@n='Activation'
0b70: 5d 7d 20 76 61 6c 75 65 20 7b 6e 20 58 5f 43 6f  ]} value {n X_Co
0b80: 6e 73 74 72 61 69 6e 74 20 70 6e 20 7b 58 20 43  nstraint pn {X C
0b90: 6f 6e 73 74 72 61 69 6e 74 7d 20 76 61 6c 75 65  onstraint} value
0ba0: 73 20 31 2c 30 20 73 74 61 74 65 20 7b 5b 63 68  s 1,0 state {[ch
0bb0: 65 63 6b 5f 73 74 61 74 65 5f 69 6e 76 20 50 6c  eck_state_inv Pl
0bc0: 61 74 65 73 5d 7d 20 76 20 31 7d 22 20 66 3d 22  ates]} v 1}" f="
0bd0: 31 22 2f 3e 0d 0a 23 20 3c 61 20 6e 3d 22 67 69  1"/>..# <a n="gi
0be0: 64 5f 67 72 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a  d_groups_conds::
0bf0: 61 64 64 46 22 20 61 3d 22 7b 24 6e 32 2f 67 72  addF" a="{$n2/gr
0c00: 6f 75 70 5b 40 6e 3d 27 46 69 78 65 64 20 63 6f  oup[@n='Fixed co
0c10: 6e 73 74 72 61 69 6e 74 73 20 41 75 74 6f 32 27  nstraints Auto2'
0c20: 5d 2f 63 6f 6e 74 61 69 6e 65 72 5b 40 6e 3d 27  ]/container[@n='
0c30: 41 63 74 69 76 61 74 69 6f 6e 27 5d 7d 20 76 61  Activation']} va
0c40: 6c 75 65 20 7b 6e 20 59 5f 43 6f 6e 73 74 72 61  lue {n Y_Constra
0c50: 69 6e 74 20 70 6e 20 7b 59 20 43 6f 6e 73 74 72  int pn {Y Constr
0c60: 61 69 6e 74 7d 20 76 61 6c 75 65 73 20 31 2c 30  aint} values 1,0
0c70: 20 73 74 61 74 65 20 7b 5b 63 68 65 63 6b 5f 73   state {[check_s
0c80: 74 61 74 65 5f 69 6e 76 20 50 6c 61 74 65 73 5d  tate_inv Plates]
0c90: 7d 20 76 20 31 7d 22 20 66 3d 22 31 22 2f 3e 0d  } v 1}" f="1"/>.
0ca0: 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72 6f  .# <a n="gid_gro
0cb0: 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46 22  ups_conds::addF"
0cc0: 20 61 3d 22 7b 24 6e 32 2f 67 72 6f 75 70 5b 40   a="{$n2/group[@
0cd0: 6e 3d 27 46 69 78 65 64 20 63 6f 6e 73 74 72 61  n='Fixed constra
0ce0: 69 6e 74 73 20 41 75 74 6f 32 27 5d 2f 63 6f 6e  ints Auto2']/con
0cf0: 74 61 69 6e 65 72 5b 40 6e 3d 27 41 63 74 69 76  tainer[@n='Activ
0d00: 61 74 69 6f 6e 27 5d 7d 20 76 61 6c 75 65 20 7b  ation']} value {
0d10: 6e 20 5a 5f 43 6f 6e 73 74 72 61 69 6e 74 20 70  n Z_Constraint p
0d20: 6e 20 7b 5a 20 43 6f 6e 73 74 72 61 69 6e 74 7d  n {Z Constraint}
0d30: 20 76 61 6c 75 65 73 20 31 2c 30 20 73 74 61 74   values 1,0 stat
0d40: 65 20 7b 5b 63 68 65 63 6b 5f 73 74 61 74 65 5f  e {[check_state_
0d50: 69 6e 76 20 7b 50 6c 61 6e 65 5f 73 74 72 61 69  inv {Plane_strai
0d60: 6e 20 50 6c 61 6e 65 5f 73 74 72 65 73 73 7d 5d  n Plane_stress}]
0d70: 7d 20 76 20 31 7d 22 20 66 3d 22 31 22 2f 3e 0d  } v 1}" f="1"/>.
0d80: 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72 6f  .# <a n="gid_gro
0d90: 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46 22  ups_conds::addF"
0da0: 20 61 3d 22 7b 24 6e 32 2f 67 72 6f 75 70 5b 40   a="{$n2/group[@
0db0: 6e 3d 27 46 69 78 65 64 20 63 6f 6e 73 74 72 61  n='Fixed constra
0dc0: 69 6e 74 73 20 41 75 74 6f 32 27 5d 2f 63 6f 6e  ints Auto2']/con
0dd0: 74 61 69 6e 65 72 5b 40 6e 3d 27 41 63 74 69 76  tainer[@n='Activ
0de0: 61 74 69 6f 6e 27 5d 7d 20 76 61 6c 75 65 20 7b  ation']} value {
0df0: 6e 20 74 68 65 74 61 5f 78 5f 43 6f 6e 73 74 72  n theta_x_Constr
0e00: 61 69 6e 74 20 70 6e 20 7b 3f 78 20 43 6f 6e 73  aint pn {?x Cons
0e10: 74 72 61 69 6e 74 7d 20 76 61 6c 75 65 73 20 31  traint} values 1
0e20: 2c 30 20 73 74 61 74 65 20 7b 5b 63 68 65 63 6b  ,0 state {[check
0e30: 5f 73 74 61 74 65 5f 69 6e 76 20 7b 50 6c 61 6e  _state_inv {Plan
0e40: 65 5f 73 74 72 61 69 6e 20 50 6c 61 6e 65 5f 73  e_strain Plane_s
0e50: 74 72 65 73 73 20 50 6c 61 74 65 73 20 53 6f 6c  tress Plates Sol
0e60: 69 64 73 7d 5d 7d 20 76 20 30 7d 22 20 66 3d 22  ids}]} v 0}" f="
0e70: 31 22 2f 3e 0d 0a 23 20 3c 61 20 6e 3d 22 67 69  1"/>..# <a n="gi
0e80: 64 5f 67 72 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a  d_groups_conds::
0e90: 61 64 64 46 22 20 61 3d 22 7b 24 6e 32 2f 67 72  addF" a="{$n2/gr
0ea0: 6f 75 70 5b 40 6e 3d 27 46 69 78 65 64 20 63 6f  oup[@n='Fixed co
0eb0: 6e 73 74 72 61 69 6e 74 73 20 41 75 74 6f 32 27  nstraints Auto2'
0ec0: 5d 2f 63 6f 6e 74 61 69 6e 65 72 5b 40 6e 3d 27  ]/container[@n='
0ed0: 41 63 74 69 76 61 74 69 6f 6e 27 5d 7d 20 76 61  Activation']} va
0ee0: 6c 75 65 20 7b 6e 20 74 68 65 74 61 5f 79 5f 43  lue {n theta_y_C
0ef0: 6f 6e 73 74 72 61 69 6e 74 20 70 6e 20 7b 3f 79  onstraint pn {?y
0f00: 20 43 6f 6e 73 74 72 61 69 6e 74 7d 20 76 61 6c   Constraint} val
0f10: 75 65 73 20 31 2c 30 20 73 74 61 74 65 20 7b 5b  ues 1,0 state {[
0f20: 63 68 65 63 6b 5f 73 74 61 74 65 5f 69 6e 76 20  check_state_inv 
0f30: 7b 50 6c 61 6e 65 5f 73 74 72 61 69 6e 20 50 6c  {Plane_strain Pl
0f40: 61 6e 65 5f 73 74 72 65 73 73 20 53 6f 6c 69 64  ane_stress Solid
0f50: 73 7d 5d 7d 20 76 20 30 7d 22 20 66 3d 22 31 22  s}]} v 0}" f="1"
0f60: 2f 3e 0d 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f  />..# <a n="gid_
0f70: 67 72 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64  groups_conds::ad
0f80: 64 46 22 20 61 3d 22 7b 24 6e 32 2f 67 72 6f 75  dF" a="{$n2/grou
0f90: 70 5b 40 6e 3d 27 46 69 78 65 64 20 63 6f 6e 73  p[@n='Fixed cons
0fa0: 74 72 61 69 6e 74 73 20 41 75 74 6f 32 27 5d 2f  traints Auto2']/
0fb0: 63 6f 6e 74 61 69 6e 65 72 5b 40 6e 3d 27 41 63  container[@n='Ac
0fc0: 74 69 76 61 74 69 6f 6e 27 5d 7d 20 76 61 6c 75  tivation']} valu
0fd0: 65 20 7b 6e 20 74 68 65 74 61 5f 7a 5f 43 6f 6e  e {n theta_z_Con
0fe0: 73 74 72 61 69 6e 74 20 70 6e 20 7b 3f 7a 20 43  straint pn {?z C
0ff0: 6f 6e 73 74 72 61 69 6e 74 7d 20 76 61 6c 75 65  onstraint} value
1000: 73 20 31 2c 30 20 73 74 61 74 65 20 7b 5b 63 68  s 1,0 state {[ch
1010: 65 63 6b 5f 73 74 61 74 65 5f 69 6e 76 20 7b 50  eck_state_inv {P
1020: 6c 61 6e 65 5f 73 74 72 61 69 6e 20 50 6c 61 6e  lane_strain Plan
1030: 65 5f 73 74 72 65 73 73 20 53 6f 6c 69 64 73 7d  e_stress Solids}
1040: 5d 7d 20 76 20 31 7d 22 20 66 3d 22 31 22 2f 3e  ]} v 1}" f="1"/>
1050: 0d 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72  ..# <a n="gid_gr
1060: 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46  oups_conds::addF
1070: 22 20 61 3d 22 7b 24 6e 32 2f 67 72 6f 75 70 5b  " a="{$n2/group[
1080: 40 6e 3d 27 46 69 78 65 64 20 63 6f 6e 73 74 72  @n='Fixed constr
1090: 61 69 6e 74 73 20 41 75 74 6f 32 27 5d 2f 63 6f  aints Auto2']/co
10a0: 6e 74 61 69 6e 65 72 5b 40 6e 3d 27 41 63 74 69  ntainer[@n='Acti
10b0: 76 61 74 69 6f 6e 27 5d 7d 20 76 61 6c 75 65 20  vation']} value 
10c0: 7b 6e 20 4c 6f 63 61 6c 5f 61 78 65 73 20 70 6e  {n Local_axes pn
10d0: 20 7b 4c 6f 63 61 6c 20 61 78 65 73 7d 20 76 61   {Local axes} va
10e0: 6c 75 65 73 20 30 2c 31 20 65 64 69 74 61 62 6c  lues 0,1 editabl
10f0: 65 20 30 20 6c 6f 63 61 6c 5f 61 78 65 73 20 64  e 0 local_axes d
1100: 69 73 61 62 6c 65 64 20 68 65 6c 70 20 7b 49 66  isabled help {If
1110: 20 74 68 65 20 64 69 72 65 63 74 69 6f 6e 20 74   the direction t
1120: 6f 20 64 65 66 69 6e 65 20 69 73 20 6e 6f 74 20  o define is not 
1130: 63 6f 69 6e 63 69 64 65 6e 74 20 77 69 74 68 20  coincident with 
1140: 74 68 65 20 67 6c 6f 62 61 6c 20 61 78 65 73 2c  the global axes,
1150: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1160: 74 6f 20 64 65 66 69 6e 65 20 61 20 73 65 74 20  to define a set 
1170: 6f 66 20 6c 6f 63 61 6c 20 61 78 65 73 20 61 6e  of local axes an
1180: 64 20 64 65 66 69 6e 65 20 74 68 65 20 64 69 73  d define the dis
1190: 70 6c 61 63 65 6d 65 6e 74 73 20 72 65 6c 61 74  placements relat
11a0: 65 64 20 74 6f 20 74 68 61 74 20 6c 6f 63 61 6c  ed to that local
11b0: 20 61 78 65 73 7d 20 73 74 61 74 65 20 7b 7d 20   axes} state {} 
11c0: 76 20 30 7d 22 20 66 3d 22 31 22 2f 3e 0d 0a 23  v 0}" f="1"/>..#
11d0: 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72 6f 75 70   <a n="gid_group
11e0: 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46 22 20 61  s_conds::addF" a
11f0: 3d 22 7b 24 6e 32 2f 67 72 6f 75 70 5b 40 6e 3d  ="{$n2/group[@n=
1200: 27 46 69 78 65 64 20 63 6f 6e 73 74 72 61 69 6e  'Fixed constrain
1210: 74 73 20 41 75 74 6f 32 27 5d 7d 20 63 6f 6e 74  ts Auto2']} cont
1220: 61 69 6e 65 72 20 7b 6e 20 56 61 6c 75 65 73 20  ainer {n Values 
1230: 70 6e 20 56 61 6c 75 65 73 7d 22 20 66 3d 22 31  pn Values}" f="1
1240: 22 2f 3e 0d 0a 23 20 3c 61 20 6e 3d 22 67 69 64  "/>..# <a n="gid
1250: 5f 67 72 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a 61  _groups_conds::a
1260: 64 64 46 22 20 61 3d 22 7b 24 6e 32 2f 67 72 6f  ddF" a="{$n2/gro
1270: 75 70 5b 40 6e 3d 27 46 69 78 65 64 20 63 6f 6e  up[@n='Fixed con
1280: 73 74 72 61 69 6e 74 73 20 41 75 74 6f 32 27 5d  straints Auto2']
1290: 2f 63 6f 6e 74 61 69 6e 65 72 5b 40 6e 3d 27 56  /container[@n='V
12a0: 61 6c 75 65 73 27 5d 7d 20 76 61 6c 75 65 20 7b  alues']} value {
12b0: 6e 20 58 5f 56 61 6c 75 65 20 70 6e 20 7b 58 20  n X_Value pn {X 
12c0: 76 61 6c 75 65 7d 20 75 6e 69 74 5f 6d 61 67 6e  value} unit_magn
12d0: 69 74 75 64 65 20 4c 20 73 74 61 74 65 20 7b 5b  itude L state {[
12e0: 63 68 65 63 6b 5f 73 74 61 74 65 5f 69 6e 76 20  check_state_inv 
12f0: 50 6c 61 74 65 73 5d 7d 20 76 20 30 2e 30 20 75  Plates]} v 0.0 u
1300: 6e 69 74 73 20 6d 7d 22 20 66 3d 22 31 22 2f 3e  nits m}" f="1"/>
1310: 0d 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72  ..# <a n="gid_gr
1320: 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46  oups_conds::addF
1330: 22 20 61 3d 22 7b 24 6e 32 2f 67 72 6f 75 70 5b  " a="{$n2/group[
1340: 40 6e 3d 27 46 69 78 65 64 20 63 6f 6e 73 74 72  @n='Fixed constr
1350: 61 69 6e 74 73 20 41 75 74 6f 32 27 5d 2f 63 6f  aints Auto2']/co
1360: 6e 74 61 69 6e 65 72 5b 40 6e 3d 27 56 61 6c 75  ntainer[@n='Valu
1370: 65 73 27 5d 7d 20 76 61 6c 75 65 20 7b 6e 20 59  es']} value {n Y
1380: 5f 56 61 6c 75 65 20 70 6e 20 7b 59 20 76 61 6c  _Value pn {Y val
1390: 75 65 7d 20 75 6e 69 74 5f 6d 61 67 6e 69 74 75  ue} unit_magnitu
13a0: 64 65 20 4c 20 73 74 61 74 65 20 7b 5b 63 68 65  de L state {[che
13b0: 63 6b 5f 73 74 61 74 65 5f 69 6e 76 20 50 6c 61  ck_state_inv Pla
13c0: 74 65 73 5d 7d 20 76 20 30 2e 30 20 75 6e 69 74  tes]} v 0.0 unit
13d0: 73 20 6d 7d 22 20 66 3d 22 31 22 2f 3e 0d 0a 23  s m}" f="1"/>..#
13e0: 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72 6f 75 70   <a n="gid_group
13f0: 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46 22 20 61  s_conds::addF" a
1400: 3d 22 7b 24 6e 32 2f 67 72 6f 75 70 5b 40 6e 3d  ="{$n2/group[@n=
1410: 27 46 69 78 65 64 20 63 6f 6e 73 74 72 61 69 6e  'Fixed constrain
1420: 74 73 20 41 75 74 6f 32 27 5d 2f 63 6f 6e 74 61  ts Auto2']/conta
1430: 69 6e 65 72 5b 40 6e 3d 27 56 61 6c 75 65 73 27  iner[@n='Values'
1440: 5d 7d 20 76 61 6c 75 65 20 7b 6e 20 5a 5f 56 61  ]} value {n Z_Va
1450: 6c 75 65 20 70 6e 20 7b 5a 20 76 61 6c 75 65 7d  lue pn {Z value}
1460: 20 75 6e 69 74 5f 6d 61 67 6e 69 74 75 64 65 20   unit_magnitude 
1470: 4c 20 73 74 61 74 65 20 7b 5b 63 68 65 63 6b 5f  L state {[check_
1480: 73 74 61 74 65 5f 69 6e 76 20 7b 50 6c 61 6e 65  state_inv {Plane
1490: 5f 73 74 72 61 69 6e 20 50 6c 61 6e 65 5f 73 74  _strain Plane_st
14a0: 72 65 73 73 7d 5d 7d 20 76 20 30 2e 30 20 75 6e  ress}]} v 0.0 un
14b0: 69 74 73 20 6d 7d 22 20 66 3d 22 31 22 2f 3e 0d  its m}" f="1"/>.
14c0: 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72 6f  .# <a n="gid_gro
14d0: 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46 22  ups_conds::addF"
14e0: 20 61 3d 22 7b 24 6e 32 2f 67 72 6f 75 70 5b 40   a="{$n2/group[@
14f0: 6e 3d 27 46 69 78 65 64 20 63 6f 6e 73 74 72 61  n='Fixed constra
1500: 69 6e 74 73 20 41 75 74 6f 32 27 5d 2f 63 6f 6e  ints Auto2']/con
1510: 74 61 69 6e 65 72 5b 40 6e 3d 27 56 61 6c 75 65  tainer[@n='Value
1520: 73 27 5d 7d 20 76 61 6c 75 65 20 7b 6e 20 74 68  s']} value {n th
1530: 65 74 61 5f 78 5f 56 61 6c 75 65 20 70 6e 20 7b  eta_x_Value pn {
1540: 3f 78 20 76 61 6c 75 65 7d 20 75 6e 69 74 5f 6d  ?x value} unit_m
1550: 61 67 6e 69 74 75 64 65 20 52 6f 74 61 74 69 6f  agnitude Rotatio
1560: 6e 20 73 74 61 74 65 20 7b 5b 63 68 65 63 6b 5f  n state {[check_
1570: 73 74 61 74 65 5f 69 6e 76 20 7b 50 6c 61 6e 65  state_inv {Plane
1580: 5f 73 74 72 61 69 6e 20 50 6c 61 6e 65 5f 73 74  _strain Plane_st
1590: 72 65 73 73 20 50 6c 61 74 65 73 20 53 6f 6c 69  ress Plates Soli
15a0: 64 73 7d 5d 7d 20 76 20 30 2e 30 20 75 6e 69 74  ds}]} v 0.0 unit
15b0: 73 20 64 65 67 7d 22 20 66 3d 22 31 22 2f 3e 0d  s deg}" f="1"/>.
15c0: 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f 67 72 6f  .# <a n="gid_gro
15d0: 75 70 73 5f 63 6f 6e 64 73 3a 3a 61 64 64 46 22  ups_conds::addF"
15e0: 20 61 3d 22 7b 24 6e 32 2f 67 72 6f 75 70 5b 40   a="{$n2/group[@
15f0: 6e 3d 27 46 69 78 65 64 20 63 6f 6e 73 74 72 61  n='Fixed constra
1600: 69 6e 74 73 20 41 75 74 6f 32 27 5d 2f 63 6f 6e  ints Auto2']/con
1610: 74 61 69 6e 65 72 5b 40 6e 3d 27 56 61 6c 75 65  tainer[@n='Value
1620: 73 27 5d 7d 20 76 61 6c 75 65 20 7b 6e 20 74 68  s']} value {n th
1630: 65 74 61 5f 79 5f 56 61 6c 75 65 20 70 6e 20 7b  eta_y_Value pn {
1640: 3f 79 20 76 61 6c 75 65 7d 20 75 6e 69 74 5f 6d  ?y value} unit_m
1650: 61 67 6e 69 74 75 64 65 20 52 6f 74 61 74 69 6f  agnitude Rotatio
1660: 6e 20 73 74 61 74 65 20 7b 5b 63 68 65 63 6b 5f  n state {[check_
1670: 73 74 61 74 65 5f 69 6e 76 20 7b 50 6c 61 6e 65  state_inv {Plane
1680: 5f 73 74 72 61 69 6e 20 50 6c 61 6e 65 5f 73 74  _strain Plane_st
1690: 72 65 73 73 20 53 6f 6c 69 64 73 7d 5d 7d 20 76  ress Solids}]} v
16a0: 20 30 2e 30 20 75 6e 69 74 73 20 64 65 67 7d 22   0.0 units deg}"
16b0: 20 66 3d 22 31 22 2f 3e 0d 0a 23 20 3c 61 20 6e   f="1"/>..# <a n
16c0: 3d 22 67 69 64 5f 67 72 6f 75 70 73 5f 63 6f 6e  ="gid_groups_con
16d0: 64 73 3a 3a 61 64 64 46 22 20 61 3d 22 7b 24 6e  ds::addF" a="{$n
16e0: 32 2f 67 72 6f 75 70 5b 40 6e 3d 27 46 69 78 65  2/group[@n='Fixe
16f0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 41 75  d constraints Au
1700: 74 6f 32 27 5d 2f 63 6f 6e 74 61 69 6e 65 72 5b  to2']/container[
1710: 40 6e 3d 27 56 61 6c 75 65 73 27 5d 7d 20 76 61  @n='Values']} va
1720: 6c 75 65 20 7b 6e 20 74 68 65 74 61 5f 7a 5f 56  lue {n theta_z_V
1730: 61 6c 75 65 20 70 6e 20 7b 3f 7a 20 76 61 6c 75  alue pn {?z valu
1740: 65 7d 20 75 6e 69 74 5f 6d 61 67 6e 69 74 75 64  e} unit_magnitud
1750: 65 20 52 6f 74 61 74 69 6f 6e 20 73 74 61 74 65  e Rotation state
1760: 20 7b 5b 63 68 65 63 6b 5f 73 74 61 74 65 5f 69   {[check_state_i
1770: 6e 76 20 7b 50 6c 61 6e 65 5f 73 74 72 61 69 6e  nv {Plane_strain
1780: 20 50 6c 61 6e 65 5f 73 74 72 65 73 73 20 53 6f   Plane_stress So
1790: 6c 69 64 73 7d 5d 7d 20 76 20 30 2e 30 20 75 6e  lids}]} v 0.0 un
17a0: 69 74 73 20 64 65 67 7d 22 20 66 3d 22 31 22 2f  its deg}" f="1"/
17b0: 3e 0d 0a 23 20 0d 0a 23 20 3c 61 20 6e 3d 22 67  >..# ..# <a n="g
17c0: 69 64 5f 67 72 6f 75 70 73 5f 63 6f 6e 64 73 3a  id_groups_conds:
17d0: 3a 61 64 64 46 22 20 61 3d 22 7b 24 6e 33 7d 20  :addF" a="{$n3} 
17e0: 67 72 6f 75 70 20 7b 6e 20 7b 53 65 6c 66 20 77  group {n {Self w
17f0: 65 69 67 68 74 20 6c 6f 61 64 20 41 75 74 6f 7d  eight load Auto}
1800: 7d 22 20 66 3d 22 31 22 2f 3e 0d 0a 23 20 3c 61  }" f="1"/>..# <a
1810: 20 6e 3d 22 63 68 61 6e 67 65 5f 67 72 6f 75 70   n="change_group
1820: 5f 70 72 6f 70 65 72 74 69 65 73 22 20 70 6e 3d  _properties" pn=
1830: 22 43 68 61 6e 67 65 20 67 72 6f 75 70 20 70 72  "Change group pr
1840: 6f 70 65 72 74 69 65 73 20 74 6f 20 67 72 6f 75  operties to grou
1850: 70 20 53 65 6c 66 20 77 65 69 67 68 74 20 6c 6f  p Self weight lo
1860: 61 64 20 41 75 74 6f 20 2d 20 74 79 70 65 20 3d  ad Auto - type =
1870: 20 42 43 22 20 61 3d 22 7b 7b 53 65 6c 66 20 77   BC" a="{{Self w
1880: 65 69 67 68 74 20 6c 6f 61 64 20 41 75 74 6f 7d  eight load Auto}
1890: 7d 20 74 79 70 65 20 42 43 22 20 66 3d 22 31 22  } type BC" f="1"
18a0: 2f 3e 0d 0a 23 20 3c 61 20 6e 3d 22 67 69 64 5f  />..# <a n="gid_
18b0: 67 72 6f 75 70 73 5f 63 6f 6e 64 73 3a 3a 73 65  groups_conds::se
18c0: 74 41 74 74 72 69 62 75 74 65 73 46 22 20 70 6e  tAttributesF" pn
18d0: 3d 22 73 65 74 61 74 74 72 69 62 75 74 65 73 22  ="setattributes"
18e0: 20 61 3d 22 7b 63 6f 6e 74 61 69 6e 65 72 5b 40   a="{container[@
18f0: 6e 3d 27 6c 6f 61 64 63 61 73 65 73 27 5d 2f 62  n='loadcases']/b
1900: 6c 6f 63 6b 64 61 74 61 5b 40 6e 3d 27 6c 6f 61  lockdata[@n='loa
1910: 64 63 61 73 65 27 5d 5b 31 5d 7d 20 7b 61 63 74  dcase'][1]} {act
1920: 69 76 65 20 31 7d 22 20 66 3d 22 31 22 2f 3e 0d  ive 1}" f="1"/>.
1930: 0a 23 20 0d 0a 23 20 3c 2f 67 69 64 70 6f 73 74  .# ..# </gidpost
1940: 5f 62 61 74 63 68 3e 0d 0a 0d 0a 70 72 6f 63 20  _batch>....proc 
1950: 73 76 67 6d 6c 3a 3a 70 61 72 73 65 5f 70 72 6f  svgml::parse_pro
1960: 70 73 20 7b 20 63 6f 6e 74 65 6e 74 20 61 63 63  ps { content acc
1970: 65 70 74 5f 61 64 64 20 6c 69 6e 65 20 7d 20 7b  ept_add line } {
1980: 0d 0a 20 20 20 20 0d 0a 20 20 20 20 73 65 74 20  ..    ..    set 
1990: 70 72 6f 70 73 20 22 22 0d 0a 20 20 20 20 69 66  props ""..    if
19a0: 20 7b 20 21 24 61 63 63 65 70 74 5f 61 64 64 20   { !$accept_add 
19b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  } {..        set
19c0: 20 72 65 78 20 7b 28 29 5c 6d 28 5b 61 2d 7a 41   rex {()\m([a-zA
19d0: 2d 5a 5d 5b 2d 5c 77 5d 2a 29 5c 73 2a 3a 28 5b  -Z][-\w]*)\s*:([
19e0: 5e 3b 5d 2a 29 3b 7d 0d 0a 20 20 20 20 7d 20 65  ^;]*);}..    } e
19f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
1a00: 65 74 20 72 65 78 20 7b 28 5c 2b 29 3f 5c 6d 28  et rex {(\+)?\m(
1a10: 5b 61 2d 7a 41 2d 5a 5d 5b 2d 5c 77 5d 2a 29 5c  [a-zA-Z][-\w]*)\
1a20: 73 2a 3a 28 5b 5e 3b 5d 2a 29 3b 7d 0d 0a 20 20  s*:([^;]*);}..  
1a30: 20 20 7d 0d 0a 20 20 20 20 73 65 74 20 63 20 30    }..    set c 0
1a40: 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 22 61  ..    foreach "a
1a50: 6c 6c 49 20 61 64 64 49 20 6e 49 20 76 49 22 20  llI addI nI vI" 
1a60: 5b 72 65 67 65 78 70 20 2d 69 6e 6c 69 6e 65 20  [regexp -inline 
1a70: 2d 61 6c 6c 20 2d 69 6e 64 69 63 65 73 20 24 72  -all -indices $r
1a80: 65 78 20 24 63 6f 6e 74 65 6e 74 5d 20 7b 0d 0a  ex $content] {..
1a90: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1aa0: 69 20 5b 6c 69 73 74 20 61 64 64 20 6e 20 76 5d  i [list add n v]
1ab0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ac0: 73 65 74 20 24 69 20 5b 73 74 72 69 6e 67 20 72  set $i [string r
1ad0: 61 6e 67 65 20 24 63 6f 6e 74 65 6e 74 20 7b 2a  ange $content {*
1ae0: 7d 5b 73 65 74 20 24 7b 69 7d 49 5d 5d 0d 0a 20  }[set ${i}I]].. 
1af0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b00: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 28    regsub -all {(
1b10: 3f 69 29 28 5e 7c 5b 5e 5c 5c 5d 29 5c 5c 30 30  ?i)(^|[^\\])\\00
1b20: 33 42 7d 20 24 76 20 7b 5c 31 3b 7d 20 76 0d 0a  3B} $v {\1;} v..
1b30: 20 20 20 20 20 20 20 20 72 65 67 73 75 62 20 2d          regsub -
1b40: 61 6c 6c 20 7b 28 3f 69 29 5c 5c 28 5c 5c 30 30  all {(?i)\\(\\00
1b50: 33 42 29 7d 20 24 76 20 7b 5c 31 7d 20 76 0d 0a  3B)} $v {\1} v..
1b60: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 21  ..        if { !
1b70: 24 61 63 63 65 70 74 5f 61 64 64 20 7d 20 7b 0d  $accept_add } {.
1b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
1b90: 70 65 6e 64 20 70 72 6f 70 73 20 24 6e 20 24 76  pend props $n $v
1ba0: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
1bb0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bc0: 6c 61 70 70 65 6e 64 20 70 72 6f 70 73 20 24 61  lappend props $a
1bd0: 64 64 20 24 6e 20 24 76 0d 0a 20 20 20 20 20 20  dd $n $v..      
1be0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 73 65 74    }..        set
1bf0: 20 70 72 65 76 20 5b 73 74 72 69 6e 67 20 72 61   prev [string ra
1c00: 6e 67 65 20 24 63 6f 6e 74 65 6e 74 20 24 63 20  nge $content $c 
1c10: 5b 6c 69 6e 64 65 78 20 24 61 6c 6c 49 20 30 5d  [lindex $allI 0]
1c20: 2d 31 5d 0d 0a 20 20 20 20 20 20 20 20 69 66 20  -1]..        if 
1c30: 7b 20 5b 72 65 67 65 78 70 20 7b 5c 77 2b 7d 20  { [regexp {\w+} 
1c40: 24 70 72 65 76 5d 20 7d 20 7b 0d 0a 20 20 20 20  $prev] } {..    
1c50: 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 65          error "e
1c60: 72 72 6f 72 20 77 69 74 68 20 64 61 74 61 20 27  rror with data '
1c70: 24 70 72 65 76 27 20 2d 2d 2d 20 24 6c 69 6e 65  $prev' --- $line
1c80: 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  "..        }..  
1c90: 20 20 20 20 20 20 73 65 74 20 63 20 5b 65 78 70        set c [exp
1ca0: 72 20 7b 5b 6c 69 6e 64 65 78 20 24 61 6c 6c 49  r {[lindex $allI
1cb0: 20 31 5d 2b 31 7d 5d 20 0d 0a 20 20 20 20 7d 0d   1]+1}] ..    }.
1cc0: 0a 20 20 20 20 73 65 74 20 70 72 65 76 20 5b 73  .    set prev [s
1cd0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 63 6f 6e  tring range $con
1ce0: 74 65 6e 74 20 24 63 20 65 6e 64 5d 0d 0a 20 20  tent $c end]..  
1cf0: 20 20 69 66 20 7b 20 5b 72 65 67 65 78 70 20 7b    if { [regexp {
1d00: 5c 77 2b 7d 20 24 70 72 65 76 5d 20 7d 20 7b 0d  \w+} $prev] } {.
1d10: 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22  .        error "
1d20: 65 72 72 6f 72 20 77 69 74 68 20 64 61 74 61 20  error with data 
1d30: 27 24 70 72 65 76 27 20 2d 2d 2d 20 24 6c 69 6e  '$prev' --- $lin
1d40: 65 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72  e"..    }..    r
1d50: 65 74 75 72 6e 20 24 70 72 6f 70 73 0d 0a 7d 0d  eturn $props..}.
1d60: 0a 0d 0a 70 72 6f 63 20 73 76 67 6d 6c 3a 3a 61  ...proc svgml::a
1d70: 70 70 65 6e 64 5f 6c 69 6e 65 20 7b 20 64 5f 6e  ppend_line { d_n
1d80: 61 6d 65 20 69 64 20 6c 69 6e 65 20 63 6f 6e 74  ame id line cont
1d90: 65 6e 74 20 7d 20 7b 0d 0a 20 20 20 20 75 70 76  ent } {..    upv
1da0: 61 72 20 24 64 5f 6e 61 6d 65 20 64 0d 0a 20 20  ar $d_name d..  
1db0: 20 20 0d 0a 20 20 20 20 64 69 63 74 20 73 65 74    ..    dict set
1dc0: 20 64 20 69 64 73 20 24 69 64 20 6c 69 6e 65 20   d ids $id line 
1dd0: 24 6c 69 6e 65 0d 0a 20 20 20 20 64 69 63 74 20  $line..    dict 
1de0: 73 65 74 20 64 20 69 64 73 20 24 69 64 20 70 72  set d ids $id pr
1df0: 6f 70 73 20 5b 70 61 72 73 65 5f 70 72 6f 70 73  ops [parse_props
1e00: 20 24 63 6f 6e 74 65 6e 74 20 30 20 24 6c 69 6e   $content 0 $lin
1e10: 65 5d 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 73 76  e]..}....proc sv
1e20: 67 6d 6c 3a 3a 73 65 74 5f 65 72 72 6f 72 20 7b  gml::set_error {
1e30: 20 64 20 69 64 20 74 78 74 20 7d 20 7b 0d 0a 20   d id txt } {.. 
1e40: 20 20 20 65 72 72 6f 72 20 22 65 72 72 6f 72 3a     error "error:
1e50: 20 24 74 78 74 20 2d 2d 2d 20 6c 69 6e 65 3a 5b   $txt --- line:[
1e60: 64 69 63 74 20 67 65 74 20 24 64 20 69 64 73 20  dict get $d ids 
1e70: 24 69 64 20 6c 69 6e 65 5d 22 0d 0a 7d 0d 0a 0d  $id line]"..}...
1e80: 0a 70 72 6f 63 20 73 76 67 6d 6c 3a 3a 67 69 76  .proc svgml::giv
1e90: 65 5f 70 72 6f 70 20 7b 20 64 20 69 64 20 6e 61  e_prop { d id na
1ea0: 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 0d 0a 20 20  me } {..    ..  
1eb0: 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65 78    if { ![dict ex
1ec0: 69 73 74 73 20 24 64 20 69 64 73 20 24 69 64 20  ists $d ids $id 
1ed0: 70 72 6f 70 73 20 24 6e 61 6d 65 5d 20 7d 20 7b  props $name] } {
1ee0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 5f 65 72  ..        set_er
1ef0: 72 6f 72 20 24 64 20 24 69 64 20 22 70 72 6f 70  ror $d $id "prop
1f00: 65 72 74 79 20 27 24 6e 61 6d 65 27 20 64 6f 65  erty '$name' doe
1f10: 73 20 6e 6f 74 20 65 78 69 73 74 22 0d 0a 20 20  s not exist"..  
1f20: 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
1f30: 5b 64 69 63 74 20 67 65 74 20 24 64 20 69 64 73  [dict get $d ids
1f40: 20 24 69 64 20 70 72 6f 70 73 20 24 6e 61 6d 65   $id props $name
1f50: 5d 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 73 76 67  ]..}....proc svg
1f60: 6d 6c 3a 3a 67 69 76 65 5f 70 72 6f 70 44 20 7b  ml::give_propD {
1f70: 20 64 20 69 64 20 6e 61 6d 65 20 64 65 66 61 75   d id name defau
1f80: 6c 74 20 7d 20 7b 0d 0a 20 20 20 20 0d 0a 20 20  lt } {..    ..  
1f90: 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65 78    if { ![dict ex
1fa0: 69 73 74 73 20 24 64 20 69 64 73 20 24 69 64 20  ists $d ids $id 
1fb0: 70 72 6f 70 73 20 24 6e 61 6d 65 5d 20 7d 20 7b  props $name] } {
1fc0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1fd0: 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 7d   $default..    }
1fe0: 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 64 69  ..    return [di
1ff0: 63 74 20 67 65 74 20 24 64 20 69 64 73 20 24 69  ct get $d ids $i
2000: 64 20 70 72 6f 70 73 20 24 6e 61 6d 65 5d 0d 0a  d props $name]..
2010: 7d 0d 0a 0d 0a 70 72 6f 63 20 73 76 67 6d 6c 3a  }....proc svgml:
2020: 3a 62 62 6f 78 5f 74 6f 5f 70 6f 69 6e 74 73 20  :bbox_to_points 
2030: 7b 20 62 62 6f 78 20 7d 20 7b 0d 0a 20 20 20 20  { bbox } {..    
2040: 6c 61 73 73 69 67 6e 20 24 62 62 6f 78 20 78 20  lassign $bbox x 
2050: 79 20 77 20 68 20 20 0d 0a 20 20 20 20 72 65 74  y w h  ..    ret
2060: 75 72 6e 20 5b 6c 69 73 74 20 22 24 78 20 24 79  urn [list "$x $y
2070: 22 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 7b 24  " [list [expr {$
2080: 78 2b 24 77 7d 5d 20 5b 65 78 70 72 20 7b 24 79  x+$w}] [expr {$y
2090: 2b 24 68 7d 5d 5d 5d 0d 0a 7d 0d 0a 0d 0a 70 72  +$h}]]]..}....pr
20a0: 6f 63 20 73 76 67 6d 6c 3a 3a 61 64 64 5f 74 6f  oc svgml::add_to
20b0: 5f 62 62 6f 78 20 7b 20 69 64 20 62 62 6f 78 20  _bbox { id bbox 
20c0: 7d 20 7b 0d 0a 20 20 20 20 76 61 72 69 61 62 6c  } {..    variabl
20d0: 65 20 64 0d 0a 20 20 20 20 0d 0a 20 20 20 20 69  e d..    ..    i
20e0: 66 20 7b 20 5b 64 69 63 74 20 65 78 69 73 74 73  f { [dict exists
20f0: 20 64 20 69 64 73 20 24 69 64 20 62 62 6f 78 5d   d ids $id bbox]
2100: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65   } {..        se
2110: 74 20 70 6e 74 73 20 22 22 0d 0a 20 20 20 20 20  t pnts ""..     
2120: 20 20 20 6c 61 70 70 65 6e 64 20 70 6e 74 73 20     lappend pnts 
2130: 7b 2a 7d 5b 62 62 6f 78 5f 74 6f 5f 70 6f 69 6e  {*}[bbox_to_poin
2140: 74 73 20 5b 64 69 63 74 20 67 65 74 20 64 20 69  ts [dict get d i
2150: 64 73 20 24 69 64 20 62 62 6f 78 5d 5d 0d 0a 20  ds $id bbox]].. 
2160: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70         lappend p
2170: 6e 74 73 20 7b 2a 7d 5b 62 62 6f 78 5f 74 6f 5f  nts {*}[bbox_to_
2180: 70 6f 69 6e 74 73 20 24 62 62 6f 78 5d 0d 0a 20  points $bbox].. 
2190: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
21a0: 6e 74 20 24 70 6e 74 73 20 7b 0d 0a 20 20 20 20  nt $pnts {..    
21b0: 20 20 20 20 20 20 20 20 69 66 20 7b 20 21 5b 69          if { ![i
21c0: 6e 66 6f 20 65 78 69 73 74 73 20 78 30 5d 20 7c  nfo exists x0] |
21d0: 7c 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 20 30  | [lindex $pnt 0
21e0: 5d 3c 24 78 30 20 7d 20 7b 20 73 65 74 20 78 30  ]<$x0 } { set x0
21f0: 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 20 30 5d   [lindex $pnt 0]
2200: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2210: 69 66 20 7b 20 21 5b 69 6e 66 6f 20 65 78 69 73  if { ![info exis
2220: 74 73 20 79 30 5d 20 7c 7c 20 5b 6c 69 6e 64 65  ts y0] || [linde
2230: 78 20 24 70 6e 74 20 31 5d 3c 24 79 30 20 7d 20  x $pnt 1]<$y0 } 
2240: 7b 20 73 65 74 20 79 30 20 5b 6c 69 6e 64 65 78  { set y0 [lindex
2250: 20 24 70 6e 74 20 31 5d 20 7d 0d 0a 20 20 20 20   $pnt 1] }..    
2260: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66      }..        f
2270: 6f 72 65 61 63 68 20 70 6e 74 20 24 70 6e 74 73  oreach pnt $pnts
2280: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2290: 69 66 20 7b 20 21 5b 69 6e 66 6f 20 65 78 69 73  if { ![info exis
22a0: 74 73 20 77 5d 20 7c 7c 20 5b 6c 69 6e 64 65 78  ts w] || [lindex
22b0: 20 24 70 6e 74 20 30 5d 2d 24 78 30 20 3e 20 24   $pnt 0]-$x0 > $
22c0: 77 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  w } {..         
22d0: 20 20 20 20 20 20 20 73 65 74 20 77 20 5b 65 78         set w [ex
22e0: 70 72 20 7b 5b 6c 69 6e 64 65 78 20 24 70 6e 74  pr {[lindex $pnt
22f0: 20 30 5d 2d 24 78 30 7d 5d 0d 0a 20 20 20 20 20   0]-$x0}]..     
2300: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2310: 20 20 20 20 20 20 69 66 20 7b 20 21 5b 69 6e 66        if { ![inf
2320: 6f 20 65 78 69 73 74 73 20 68 5d 20 7c 7c 20 5b  o exists h] || [
2330: 6c 69 6e 64 65 78 20 24 70 6e 74 20 31 5d 2d 24  lindex $pnt 1]-$
2340: 79 30 20 3e 20 24 68 20 7d 20 7b 0d 0a 20 20 20  y0 > $h } {..   
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
2360: 20 68 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65   h [expr {[linde
2370: 78 20 24 70 6e 74 20 31 5d 2d 24 79 30 7d 5d 0d  x $pnt 1]-$y0}].
2380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2390: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23a0: 20 20 20 73 65 74 20 62 62 6f 78 20 5b 6c 69 73     set bbox [lis
23b0: 74 20 24 78 30 20 24 79 30 20 24 77 20 24 68 5d  t $x0 $y0 $w $h]
23c0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 64 69 63  ..    }..    dic
23d0: 74 20 73 65 74 20 64 20 69 64 73 20 24 69 64 20  t set d ids $id 
23e0: 62 62 6f 78 20 24 62 62 6f 78 0d 0a 7d 0d 0a 0d  bbox $bbox..}...
23f0: 0a 70 72 6f 63 20 73 76 67 6d 6c 3a 3a 72 6f 74  .proc svgml::rot
2400: 61 74 65 5f 61 6e 67 6c 65 73 20 7b 20 61 6e 67  ate_angles { ang
2410: 6c 65 78 79 20 61 6e 67 6c 65 7a 20 7d 20 7b 0d  lexy anglez } {.
2420: 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 73  .        ..    s
2430: 65 74 20 61 6e 67 6c 65 78 79 5f 52 20 5b 65 78  et anglexy_R [ex
2440: 70 72 20 7b 24 6d 3a 3a 64 65 67 74 6f 72 61 64  pr {$m::degtorad
2450: 2a 28 24 61 6e 67 6c 65 78 79 2b 39 30 2e 30 29  *($anglexy+90.0)
2460: 7d 5d 0d 0a 20 20 20 20 73 65 74 20 61 6e 67 6c  }]..    set angl
2470: 65 7a 5f 52 20 5b 65 78 70 72 20 7b 2d 31 2e 30  ez_R [expr {-1.0
2480: 2a 24 6d 3a 3a 64 65 67 74 6f 72 61 64 2a 28 24  *$m::degtorad*($
2490: 61 6e 67 6c 65 7a 2d 39 30 2e 30 29 7d 5d 0d 0a  anglez-90.0)}]..
24a0: 20 20 20 20 73 65 74 20 61 20 5b 6d 3a 3a 71 75      set a [m::qu
24b0: 61 74 65 72 6e 69 6f 6e 3a 3a 72 6f 74 61 74 69  aternion::rotati
24c0: 6f 6e 20 5b 6c 69 73 74 20 30 2e 30 20 30 2e 30  on [list 0.0 0.0
24d0: 20 31 2e 30 5d 20 24 61 6e 67 6c 65 78 79 5f 52   1.0] $anglexy_R
24e0: 5d 0d 0a 20 20 20 20 73 65 74 20 6e 65 77 61 78  ]..    set newax
24f0: 69 73 20 5b 6d 3a 3a 71 75 61 74 65 72 6e 69 6f  is [m::quaternio
2500: 6e 3a 3a 72 6f 74 61 74 69 6f 6e 20 5b 6c 69 73  n::rotation [lis
2510: 74 20 31 2e 30 20 30 2e 30 20 30 2e 30 5d 20 24  t 1.0 0.0 0.0] $
2520: 61 6e 67 6c 65 7a 5f 52 5d 0d 0a 20 20 20 20 73  anglez_R]..    s
2530: 65 74 20 72 6f 74 61 74 69 6f 6e 5f 76 65 63 74  et rotation_vect
2540: 6f 72 20 5b 6d 3a 3a 71 75 61 74 65 72 6e 69 6f  or [m::quaternio
2550: 6e 3a 3a 6d 75 6c 74 69 70 6c 79 20 24 61 20 24  n::multiply $a $
2560: 6e 65 77 61 78 69 73 5d 0d 0a 20 20 20 20 72 65  newaxis]..    re
2570: 74 75 72 6e 20 5b 6d 3a 3a 71 75 61 74 65 72 6e  turn [m::quatern
2580: 69 6f 6e 3a 3a 6e 6f 72 6d 61 6c 69 7a 65 50 20  ion::normalizeP 
2590: 24 72 6f 74 61 74 69 6f 6e 5f 76 65 63 74 6f 72  $rotation_vector
25a0: 20 36 5d 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 73   6]..}....proc s
25b0: 76 67 6d 6c 3a 3a 69 73 5f 6e 75 6d 62 65 72 20  vgml::is_number 
25c0: 7b 20 74 65 78 74 20 7d 20 7b 0d 0a 0d 0a 20 20  { text } {....  
25d0: 20 20 69 66 20 7b 20 5b 73 63 61 6e 20 24 74 65    if { [scan $te
25e0: 78 74 20 22 25 66 20 25 6e 22 20 6e 75 6d 62 65  xt "%f %n" numbe
25f0: 72 20 6c 65 6e 5d 20 3d 3d 20 30 20 7d 20 7b 20  r len] == 0 } { 
2600: 72 65 74 75 72 6e 20 30 20 7d 0d 0a 20 20 20 20  return 0 }..    
2610: 69 66 20 7b 20 21 5b 69 6e 66 6f 20 65 78 69 73  if { ![info exis
2620: 74 73 20 6c 65 6e 5d 20 7d 20 7b 20 72 65 74 75  ts len] } { retu
2630: 72 6e 20 30 20 7d 0d 0a 20 20 20 20 69 66 20 7b  rn 0 }..    if {
2640: 20 24 6c 65 6e 20 21 3d 20 5b 73 74 72 69 6e 67   $len != [string
2650: 20 6c 65 6e 67 74 68 20 24 74 65 78 74 5d 20 7d   length $text] }
2660: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0d 0a 20   { return 0 }.. 
2670: 20 20 20 72 65 74 75 72 6e 20 31 0d 0a 7d 0d 0a     return 1..}..
2680: 0d 0a 23 20 78 2c 79 20 77 68 65 72 65 20 76 61  ..# x,y where va
2690: 6c 75 65 73 20 61 72 65 3a 20 2d 31 2c 30 2c 31  lues are: -1,0,1
26a0: 0d 0a 70 72 6f 63 20 73 76 67 6d 6c 3a 3a 67 69  ..proc svgml::gi
26b0: 76 65 5f 61 6e 63 68 6f 72 5f 61 78 65 73 20 7b  ve_anchor_axes {
26c0: 20 64 20 69 64 20 7d 20 7b 0d 0a 20 20 20 20 0d   d id } {..    .
26d0: 0a 20 20 20 20 73 65 74 20 61 6e 63 68 6f 72 20  .    set anchor 
26e0: 5b 73 70 6c 69 74 20 5b 67 69 76 65 5f 70 72 6f  [split [give_pro
26f0: 70 44 20 24 64 20 24 69 64 20 61 6e 63 68 6f 72  pD $d $id anchor
2700: 20 22 22 5d 20 22 22 5d 0d 0a 20 20 20 20 0d 0a   ""] ""]..    ..
2710: 20 20 20 20 6c 61 73 73 69 67 6e 20 22 30 20 30      lassign "0 0
2720: 22 20 78 20 79 0d 0a 20 20 20 20 20 20 20 20 0d  " x y..        .
2730: 0a 20 20 20 20 69 66 20 7b 20 22 77 22 20 69 6e  .    if { "w" in
2740: 20 24 61 6e 63 68 6f 72 20 26 26 20 22 65 22 20   $anchor && "e" 
2750: 69 6e 20 24 61 6e 63 68 6f 72 20 7d 20 7b 0d 0a  in $anchor } {..
2760: 20 20 20 20 20 20 20 20 73 65 74 20 78 20 30 0d          set x 0.
2770: 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20  .    } elseif { 
2780: 22 77 22 20 69 6e 20 24 61 6e 63 68 6f 72 20 7d  "w" in $anchor }
2790: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
27a0: 78 20 31 0d 0a 20 20 20 20 7d 20 65 6c 73 65 69  x 1..    } elsei
27b0: 66 20 7b 20 22 65 22 20 69 6e 20 24 61 6e 63 68  f { "e" in $anch
27c0: 6f 72 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  or } {..        
27d0: 73 65 74 20 78 20 2d 31 0d 0a 20 20 20 20 7d 0d  set x -1..    }.
27e0: 0a 20 20 20 20 69 66 20 7b 20 22 6e 22 20 69 6e  .    if { "n" in
27f0: 20 24 61 6e 63 68 6f 72 20 26 26 20 22 73 22 20   $anchor && "s" 
2800: 69 6e 20 24 61 6e 63 68 6f 72 20 7d 20 7b 0d 0a  in $anchor } {..
2810: 20 20 20 20 20 20 20 20 73 65 74 20 79 20 30 0d          set y 0.
2820: 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20  .    } elseif { 
2830: 22 6e 22 20 69 6e 20 24 61 6e 63 68 6f 72 20 7d  "n" in $anchor }
2840: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
2850: 79 20 31 0d 0a 20 20 20 20 7d 20 65 6c 73 65 69  y 1..    } elsei
2860: 66 20 7b 20 22 73 22 20 69 6e 20 24 61 6e 63 68  f { "s" in $anch
2870: 6f 72 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  or } {..        
2880: 73 65 74 20 79 20 2d 31 0d 0a 20 20 20 20 7d 0d  set y -1..    }.
2890: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73  .    return [lis
28a0: 74 20 24 78 20 24 79 5d 0d 0a 7d 0d 0a 0d 0a 70  t $x $y]..}....p
28b0: 72 6f 63 20 73 76 67 6d 6c 3a 3a 73 70 6c 69 74  roc svgml::split
28c0: 5f 74 65 78 74 20 7b 20 74 65 78 74 20 7d 20 7b  _text { text } {
28d0: 0d 0a 20 20 20 20 0d 0a 20 20 20 20 73 65 74 20  ..    ..    set 
28e0: 72 65 74 20 22 22 0d 0a 20 20 20 20 69 66 20 7b  ret ""..    if {
28f0: 20 5b 72 65 67 65 78 70 20 7b 5c 6e 7d 20 24 74   [regexp {\n} $t
2900: 65 78 74 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  ext] } {..      
2910: 20 20 73 65 74 20 69 6c 69 6e 65 20 30 0d 0a 20    set iline 0.. 
2920: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6c         foreach l
2930: 69 6e 65 20 5b 73 70 6c 69 74 20 24 74 65 78 74  ine [split $text
2940: 20 5c 6e 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   \n] {..        
2950: 20 20 20 20 73 65 74 20 72 65 74 4c 20 5b 73 70      set retL [sp
2960: 6c 69 74 5f 74 65 78 74 20 24 6c 69 6e 65 5d 0d  lit_text $line].
2970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2980: 7b 20 24 69 6c 69 6e 65 20 3e 20 30 20 26 26 20  { $iline > 0 && 
2990: 5b 6c 6c 65 6e 67 74 68 20 24 72 65 74 4c 5d 20  [llength $retL] 
29a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
29b0: 20 20 20 20 20 6c 73 65 74 20 72 65 74 4c 20 30       lset retL 0
29c0: 20 30 20 5b 6c 69 73 74 20 7b 2a 7d 5b 6c 69 6e   0 [list {*}[lin
29d0: 64 65 78 20 24 72 65 74 4c 20 30 20 30 5d 20 6e  dex $retL 0 0] n
29e0: 65 77 6c 69 6e 65 5d 0d 0a 20 20 20 20 20 20 20  ewline]..       
29f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2a00: 20 20 20 20 69 6e 63 72 20 69 6c 69 6e 65 0d 0a      incr iline..
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
2a20: 65 6e 64 20 72 65 74 20 7b 2a 7d 24 72 65 74 4c  end ret {*}$retL
2a30: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
2a40: 20 7d 20 65 6c 73 65 69 66 20 7b 20 5b 72 65 67   } elseif { [reg
2a50: 65 78 70 20 2d 69 6e 64 69 63 65 73 20 7b 5b 7e  exp -indices {[~
2a60: 5e 2a 5f 5d 7b 31 2c 32 7d 7d 20 24 74 65 78 74  ^*_]{1,2}} $text
2a70: 20 69 64 78 73 5d 20 7d 20 7b 0d 0a 20 20 20 20   idxs] } {..    
2a80: 20 20 20 20 73 65 74 20 76 20 5b 73 74 72 69 6e      set v [strin
2a90: 67 20 72 61 6e 67 65 20 24 74 65 78 74 20 7b 2a  g range $text {*
2aa0: 7d 24 69 64 78 73 5d 0d 0a 20 20 20 20 20 20 20  }$idxs]..       
2ab0: 20 73 65 74 20 63 20 5b 65 78 70 72 20 7b 5b 6c   set c [expr {[l
2ac0: 69 6e 64 65 78 20 24 69 64 78 73 20 31 5d 2b 31  index $idxs 1]+1
2ad0: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  }]..        set 
2ae0: 72 65 78 20 22 5c 5c 5b 73 74 72 69 6e 67 20 69  rex "\\[string i
2af0: 6e 64 65 78 20 24 76 20 30 5d 5c 7b 5b 73 74 72  ndex $v 0]\{[str
2b00: 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 5d 5c 7d  ing length $v]\}
2b10: 22 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20  "..        if { 
2b20: 21 5b 72 65 67 65 78 70 20 2d 73 74 61 72 74 20  ![regexp -start 
2b30: 24 63 20 2d 69 6e 64 69 63 65 73 20 24 72 65 78  $c -indices $rex
2b40: 20 24 74 65 78 74 20 69 64 78 73 4e 5d 20 7d 20   $text idxsN] } 
2b50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
2b60: 65 74 75 72 6e 20 5b 6c 69 73 74 20 5b 6c 69 73  eturn [list [lis
2b70: 74 20 22 22 20 24 74 65 78 74 5d 5d 0d 0a 20 20  t "" $text]]..  
2b80: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2b90: 20 73 65 74 20 73 74 72 20 5b 73 74 72 69 6e 67   set str [string
2ba0: 20 72 61 6e 67 65 20 24 74 65 78 74 20 30 20 5b   range $text 0 [
2bb0: 6c 69 6e 64 65 78 20 24 69 64 78 73 20 30 5d 2d  lindex $idxs 0]-
2bc0: 31 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  1]..        set 
2bd0: 72 65 74 4c 20 5b 73 70 6c 69 74 5f 74 65 78 74  retL [split_text
2be0: 20 24 73 74 72 5d 0d 0a 20 20 20 20 20 20 20 20   $str]..        
2bf0: 6c 61 70 70 65 6e 64 20 72 65 74 20 7b 2a 7d 24  lappend ret {*}$
2c00: 72 65 74 4c 0d 0a 20 20 20 20 20 20 20 20 0d 0a  retL..        ..
2c10: 20 20 20 20 20 20 20 20 73 65 74 20 74 79 70 65          set type
2c20: 73 20 5b 6c 69 73 74 20 7b 7e 20 73 75 62 7d 20  s [list {~ sub} 
2c30: 7b 5e 20 73 75 70 7d 20 7b 2a 20 69 74 61 6c 69  {^ sup} {* itali
2c40: 63 7d 20 7b 5f 20 69 74 61 6c 69 63 7d 20 7b 2a  c} {_ italic} {*
2c50: 2a 20 62 6f 6c 64 7d 20 7b 5f 5f 20 62 6f 6c 64  * bold} {__ bold
2c60: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  }]..        set 
2c70: 69 70 6f 73 20 5b 6c 73 65 61 72 63 68 20 2d 69  ipos [lsearch -i
2c80: 6e 64 65 78 20 30 20 2d 65 78 61 63 74 20 24 74  ndex 0 -exact $t
2c90: 79 70 65 73 20 24 76 5d 0d 0a 20 20 20 20 20 20  ypes $v]..      
2ca0: 20 20 73 65 74 20 74 79 70 65 20 5b 6c 69 6e 64    set type [lind
2cb0: 65 78 20 24 74 79 70 65 73 20 24 69 70 6f 73 20  ex $types $ipos 
2cc0: 31 5d 0d 0a 20 20 20 20 20 20 20 20 0d 0a 20 20  1]..        ..  
2cd0: 20 20 20 20 20 20 73 65 74 20 73 74 72 20 5b 73        set str [s
2ce0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 74 65 78  tring range $tex
2cf0: 74 20 24 63 20 5b 6c 69 6e 64 65 78 20 24 69 64  t $c [lindex $id
2d00: 78 73 4e 20 30 5d 2d 31 5d 0d 0a 20 20 20 20 20  xsN 0]-1]..     
2d10: 20 20 20 73 65 74 20 72 65 74 4c 20 5b 73 70 6c     set retL [spl
2d20: 69 74 5f 74 65 78 74 20 24 73 74 72 5d 0d 0a 20  it_text $str].. 
2d30: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 69         foreach i
2d40: 20 24 72 65 74 4c 20 7b 0d 0a 20 20 20 20 20 20   $retL {..      
2d50: 20 20 20 20 20 20 6c 73 65 74 20 69 20 30 20 5b        lset i 0 [
2d60: 6c 69 73 74 20 7b 2a 7d 5b 6c 69 6e 64 65 78 20  list {*}[lindex 
2d70: 24 69 20 30 5d 20 24 74 79 70 65 5d 0d 0a 20 20  $i 0] $type]..  
2d80: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
2d90: 64 20 72 65 74 20 24 69 0d 0a 20 20 20 20 20 20  d ret $i..      
2da0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 0d 0a 20    }..        .. 
2db0: 20 20 20 20 20 20 20 73 65 74 20 73 74 72 20 5b         set str [
2dc0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 74 65  string range $te
2dd0: 78 74 20 5b 6c 69 6e 64 65 78 20 24 69 64 78 73  xt [lindex $idxs
2de0: 4e 20 31 5d 2b 31 20 65 6e 64 5d 0d 0a 20 20 20  N 1]+1 end]..   
2df0: 20 20 20 20 20 73 65 74 20 72 65 74 4c 20 5b 73       set retL [s
2e00: 70 6c 69 74 5f 74 65 78 74 20 24 73 74 72 5d 0d  plit_text $str].
2e10: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
2e20: 20 72 65 74 20 7b 2a 7d 24 72 65 74 4c 0d 0a 20   ret {*}$retL.. 
2e30: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 5b 73     } elseif { [s
2e40: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 65  tring length $te
2e50: 78 74 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  xt] } {..       
2e60: 20 6c 61 70 70 65 6e 64 20 72 65 74 20 5b 6c 69   lappend ret [li
2e70: 73 74 20 22 22 20 24 74 65 78 74 5d 0d 0a 20 20  st "" $text]..  
2e80: 20 20 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
2e90: 24 72 65 74 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20  $ret..}....proc 
2ea0: 73 76 67 6d 6c 3a 3a 78 6d 6c 5f 71 75 6f 74 65  svgml::xml_quote
2eb0: 20 7b 20 74 65 78 74 20 7d 20 7b 0d 0a 20 20 20   { text } {..   
2ec0: 20 73 65 74 20 6d 61 70 20 5b 6c 69 73 74 20 22   set map [list "
2ed0: 3c 22 20 22 26 6c 74 3b 22 20 22 3e 22 20 22 26  <" "&lt;" ">" "&
2ee0: 67 74 3b 22 20 22 26 22 20 22 26 61 6d 70 3b 22  gt;" "&" "&amp;"
2ef0: 5d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 73  ]..    return [s
2f00: 74 72 69 6e 67 20 6d 61 70 20 24 6d 61 70 20 24  tring map $map $
2f10: 74 65 78 74 5d 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63  text]..}....proc
2f20: 20 73 76 67 6d 6c 3a 3a 61 70 70 65 6e 64 5f 74   svgml::append_t
2f30: 73 70 61 6e 73 20 7b 20 78 20 74 65 78 74 20 7d  spans { x text }
2f40: 20 7b 0d 0a 20 20 20 20 0d 0a 20 20 20 20 72 65   {..    ..    re
2f50: 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 20 5c 74 5d  gsub -all {[ \t]
2f60: 2b 7d 20 24 74 65 78 74 20 7b 20 7d 20 74 65 78  +} $text { } tex
2f70: 74 0d 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61  t..    regsub -a
2f80: 6c 6c 20 7b 5b 20 5c 74 5d 2a 5c 6e 5b 20 5c 74  ll {[ \t]*\n[ \t
2f90: 5d 2a 7d 20 24 74 65 78 74 20 22 5c 6e 22 20 74  ]*} $text "\n" t
2fa0: 65 78 74 0d 0a 20 20 20 20 0d 0a 20 20 20 20 73  ext..    ..    s
2fb0: 65 74 20 78 6d 6c 20 22 22 0d 0a 20 20 20 20 66  et xml ""..    f
2fc0: 6f 72 65 61 63 68 20 69 20 5b 73 76 67 6d 6c 3a  oreach i [svgml:
2fd0: 3a 73 70 6c 69 74 5f 74 65 78 74 20 24 74 65 78  :split_text $tex
2fe0: 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  t] {..        la
2ff0: 73 73 69 67 6e 20 24 69 20 74 79 70 65 73 20 74  ssign $i types t
3000: 78 74 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65  xt..        appe
3010: 6e 64 20 78 6d 6c 20 22 3c 74 73 70 61 6e 22 0d  nd xml "<tspan".
3020: 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74 20  .        set st 
3030: 22 22 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65  ""..        fore
3040: 61 63 68 20 74 79 70 65 20 24 74 79 70 65 73 20  ach type $types 
3050: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
3060: 77 69 74 63 68 20 24 74 79 70 65 20 7b 0d 0a 20  witch $type {.. 
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
3080: 65 77 6c 69 6e 65 20 7b 20 61 70 70 65 6e 64 20  ewline { append 
3090: 78 6d 6c 20 22 20 78 3d 27 24 78 27 20 64 79 3d  xml " x='$x' dy=
30a0: 27 31 2e 32 65 6d 27 22 20 7d 0d 0a 20 20 20 20  '1.2em'" }..    
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62 20              sub 
30c0: 7b 20 61 70 70 65 6e 64 20 73 74 20 22 66 6f 6e  { append st "fon
30d0: 74 2d 73 69 7a 65 3a 36 35 25 3b 62 61 73 65 6c  t-size:65%;basel
30e0: 69 6e 65 2d 73 68 69 66 74 3a 73 75 62 3b 22 20  ine-shift:sub;" 
30f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
3100: 20 20 20 73 75 70 20 7b 20 61 70 70 65 6e 64 20     sup { append 
3110: 73 74 20 22 66 6f 6e 74 2d 73 69 7a 65 3a 36 35  st "font-size:65
3120: 25 3b 62 61 73 65 6c 69 6e 65 2d 73 68 69 66 74  %;baseline-shift
3130: 3a 73 75 70 3b 22 20 7d 0d 0a 20 20 20 20 20 20  :sup;" }..      
3140: 20 20 20 20 20 20 20 20 20 20 69 74 61 6c 69 63            italic
3150: 20 7b 20 61 70 70 65 6e 64 20 73 74 20 22 66 6f   { append st "fo
3160: 6e 74 2d 73 74 79 6c 65 3a 69 74 61 6c 69 63 3b  nt-style:italic;
3170: 22 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " }..           
3180: 20 20 20 20 20 62 6f 6c 64 20 7b 20 61 70 70 65       bold { appe
3190: 6e 64 20 73 74 20 22 66 6f 6e 74 2d 77 65 69 67  nd st "font-weig
31a0: 68 74 3a 62 6f 6c 64 3b 22 20 7d 0d 0a 20 20 20  ht:bold;" }..   
31b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
31c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69      }..        i
31d0: 66 20 7b 20 24 73 74 20 6e 65 20 22 22 20 7d 20  f { $st ne "" } 
31e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  {..            a
31f0: 70 70 65 6e 64 20 78 6d 6c 20 22 20 73 74 79 6c  ppend xml " styl
3200: 65 3d 27 24 73 74 27 22 0d 0a 20 20 20 20 20 20  e='$st'"..      
3210: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 61 70 70    }..        app
3220: 65 6e 64 20 78 6d 6c 20 22 3e 5b 78 6d 6c 5f 71  end xml ">[xml_q
3230: 75 6f 74 65 20 24 74 78 74 5d 3c 2f 74 73 70 61  uote $txt]</tspa
3240: 6e 3e 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20  n>"..    }..    
3250: 72 65 74 75 72 6e 20 24 78 6d 6c 0d 0a 7d 0d 0a  return $xml..}..
3260: 0d 0a 70 72 6f 63 20 73 76 67 6d 6c 3a 3a 63 72  ..proc svgml::cr
3270: 65 61 74 65 20 7b 20 74 78 74 20 7d 20 7b 0d 0a  eate { txt } {..
3280: 20 20 20 20 76 61 72 69 61 62 6c 65 20 64 0d 0a      variable d..
3290: 20 20 20 20 76 61 72 69 61 62 6c 65 20 78 6d 6c      variable xml
32a0: 0d 0a 20 20 20 20 0d 0a 23 23 23 23 23 23 23 23  ..    ..########
32b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32f0: 23 23 23 23 23 23 23 23 23 0d 0a 23 20 20 20 20  #########..#    
3300: 69 6e 69 74 69 61 6c 20 70 61 72 73 69 6e 67 20  initial parsing 
3310: 62 79 20 6c 69 6e 65 73 0d 0a 23 23 23 23 23 23  by lines..######
3320: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3330: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3360: 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20 20 20  ###########..   
3370: 20 0d 0a 20 20 20 20 6c 61 73 73 69 67 6e 20 22   ..    lassign "
3380: 22 20 64 20 6c 69 6e 65 0d 0a 20 20 20 20 0d 0a  " d line..    ..
3390: 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20 63      dict set d c
33a0: 6c 61 73 73 65 73 20 22 22 0d 0a 20 20 20 20 0d  lasses ""..    .
33b0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6c 6e 20  .    foreach ln 
33c0: 5b 73 70 6c 69 74 20 24 74 78 74 20 5c 6e 5d 20  [split $txt \n] 
33d0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 67 73 75  {..        regsu
33e0: 62 20 2d 61 6c 6c 20 7b 3c 21 2d 2d 2e 2a 3f 20  b -all {<!--.*? 
33f0: 2d 2d 3e 7d 20 24 6c 6e 20 7b 7d 20 6c 6e 0d 0a  -->} $ln {} ln..
3400: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 72 65          if { [re
3410: 67 65 78 70 20 7b 28 2e 2a 5b 5e 5c 5c 5d 29 5c  gexp {(.*[^\\])\
3420: 5c 5c 73 2a 24 7d 20 24 6c 6e 20 7b 7d 20 70 72  \\s*$} $ln {} pr
3430: 65 66 69 78 5d 20 7d 20 7b 0d 0a 20 20 20 20 20  efix] } {..     
3440: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 6c 69         append li
3450: 6e 65 20 24 70 72 65 66 69 78 0d 0a 20 20 20 20  ne $prefix..    
3460: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3470: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
3480: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3490: 61 70 70 65 6e 64 20 6c 69 6e 65 20 24 6c 6e 20  append line $ln 
34a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
34b0: 20 20 20 20 20 69 66 20 7b 20 5b 72 65 67 65 78       if { [regex
34c0: 70 20 7b 5e 5c 73 2a 5c 2b 73 76 67 6d 6c 28 5c  p {^\s*\+svgml(\
34d0: 53 2b 29 5c 73 2b 28 2e 2a 29 7d 20 24 6c 69 6e  S+)\s+(.*)} $lin
34e0: 65 20 7b 7d 20 76 65 72 73 69 6f 6e 20 63 6f 6e  e {} version con
34f0: 74 65 6e 74 5d 20 7d 20 7b 0d 0a 20 20 20 20 20  tent] } {..     
3500: 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 6c 69         append_li
3510: 6e 65 20 64 20 30 20 24 6c 69 6e 65 20 24 63 6f  ne d 0 $line $co
3520: 6e 74 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 20  ntent..         
3530: 20 20 20 64 69 63 74 20 73 65 74 20 64 20 76 65     dict set d ve
3540: 72 73 69 6f 6e 20 24 76 65 72 73 69 6f 6e 0d 0a  rsion $version..
3550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
3560: 74 20 77 69 64 74 68 20 5b 67 69 76 65 5f 70 72  t width [give_pr
3570: 6f 70 20 24 64 20 30 20 77 69 64 74 68 5d 0d 0a  op $d 0 width]..
3580: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3590: 68 65 69 67 68 74 20 5b 67 69 76 65 5f 70 72 6f  height [give_pro
35a0: 70 20 24 64 20 30 20 68 65 69 67 68 74 5d 0d 0a  p $d 0 height]..
35b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
35c0: 20 7b 20 5b 72 65 67 65 78 70 20 7b 28 5c 64 2b   { [regexp {(\d+
35d0: 29 25 7d 20 24 68 65 69 67 68 74 20 7b 7d 20 70  )%} $height {} p
35e0: 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ] } {..         
35f0: 20 20 20 20 20 20 20 73 65 74 20 68 65 69 67 68         set heigh
3600: 74 20 5b 65 78 70 72 20 7b 69 6e 74 28 24 70 2f  t [expr {int($p/
3610: 31 30 30 2e 30 2a 24 77 69 64 74 68 29 7d 5d 0d  100.0*$width)}].
3620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
3630: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63 74              dict
3640: 20 73 65 74 20 64 20 69 64 73 20 5f 5f 52 4f 4f   set d ids __ROO
3650: 54 20 62 62 6f 78 20 5b 6c 69 73 74 20 30 20 30  T bbox [list 0 0
3660: 20 31 30 30 20 31 30 30 5d 0d 0a 20 20 20 20 20   100 100]..     
3670: 20 20 20 20 20 20 20 64 69 63 74 20 73 65 74 20         dict set 
3680: 64 20 69 64 73 20 5f 5f 52 4f 4f 54 20 70 72 6f  d ids __ROOT pro
3690: 70 73 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20  ps ""..         
36a0: 20 20 20 64 69 63 74 20 73 65 74 20 64 20 69 64     dict set d id
36b0: 73 20 30 20 62 62 6f 78 20 5b 6c 69 73 74 20 30  s 0 bbox [list 0
36c0: 20 30 20 24 77 69 64 74 68 20 24 68 65 69 67 68   0 $width $heigh
36d0: 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t]..            
36e0: 64 69 63 74 20 73 65 74 20 64 20 69 64 73 20 30  dict set d ids 0
36f0: 20 62 62 6f 78 4c 20 5b 64 69 63 74 20 67 65 74   bboxL [dict get
3700: 20 24 64 20 69 64 73 20 30 20 62 62 6f 78 5d 0d   $d ids 0 bbox].
3710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63  .            dic
3720: 74 20 73 65 74 20 64 20 69 64 73 20 30 20 61 6e  t set d ids 0 an
3730: 67 6c 65 20 30 0d 0a 20 20 20 20 20 20 20 20 7d  gle 0..        }
3740: 20 65 6c 73 65 69 66 20 7b 20 5b 72 65 67 65 78   elseif { [regex
3750: 70 20 7b 5e 5c 73 2a 5c 2b 61 6c 69 61 73 5c 73  p {^\s*\+alias\s
3760: 2b 28 5c 53 2e 2a 29 7d 20 24 6c 69 6e 65 20 7b  +(\S.*)} $line {
3770: 7d 20 63 6f 6e 74 65 6e 74 5d 20 7d 20 7b 0d 0a  } content] } {..
3780: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
3790: 61 63 68 20 22 6c 6f 6e 67 20 73 68 6f 72 74 22  ach "long short"
37a0: 20 5b 70 61 72 73 65 5f 70 72 6f 70 73 20 24 63   [parse_props $c
37b0: 6f 6e 74 65 6e 74 20 30 20 24 6c 69 6e 65 5d 20  ontent 0 $line] 
37c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
37d0: 20 20 20 64 69 63 74 20 73 65 74 20 64 20 61 6c     dict set d al
37e0: 69 61 73 20 24 73 68 6f 72 74 20 24 6c 6f 6e 67  ias $short $long
37f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
3800: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69  .        } elsei
3810: 66 20 7b 20 5b 72 65 67 65 78 70 20 7b 5e 5c 73  f { [regexp {^\s
3820: 2a 5c 2b 76 61 72 69 61 62 6c 65 73 5c 73 2b 28  *\+variables\s+(
3830: 5c 53 2e 2a 29 7d 20 24 6c 69 6e 65 20 7b 7d 20  \S.*)} $line {} 
3840: 63 6f 6e 74 65 6e 74 5d 20 7d 20 7b 0d 0a 20 20  content] } {..  
3850: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
3860: 68 20 22 61 64 64 20 6e 20 76 22 20 5b 70 61 72  h "add n v" [par
3870: 73 65 5f 70 72 6f 70 73 20 24 63 6f 6e 74 65 6e  se_props $conten
3880: 74 20 31 20 24 6c 69 6e 65 5d 20 7b 0d 0a 20 20  t 1 $line] {..  
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
38a0: 20 7b 20 24 61 64 64 20 6e 65 20 22 22 20 7d 20   { $add ne "" } 
38b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
38c0: 20 20 20 20 20 20 20 73 65 74 20 76 4f 6c 64 20         set vOld 
38d0: 5b 64 69 63 74 20 67 65 74 20 24 64 20 76 61 72  [dict get $d var
38e0: 69 61 62 6c 65 73 20 24 6e 5d 0d 0a 20 20 20 20  iables $n]..    
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 61 70 70 65 6e 64 20 76 4f 6c 64 20 24 76 0d 0a  append vOld $v..
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20 76      dict set d v
3930: 61 72 69 61 62 6c 65 73 20 24 6e 20 24 76 4f 6c  ariables $n $vOl
3940: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
3950: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 5b 64     } elseif { [d
3960: 69 63 74 20 65 78 69 73 74 73 20 24 64 20 76 61  ict exists $d va
3970: 72 69 61 62 6c 65 73 20 24 6e 5d 20 7d 20 7b 0d  riables $n] } {.
3980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3990: 20 20 20 20 20 65 72 72 6f 72 20 22 72 65 70 65       error "repe
39a0: 61 74 65 64 20 76 61 72 69 61 62 6c 65 20 27 24  ated variable '$
39b0: 6c 69 6e 65 27 22 0d 0a 20 20 20 20 20 20 20 20  line'"..        
39c0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
39d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
39e0: 20 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64        dict set d
39f0: 20 76 61 72 69 61 62 6c 65 73 20 24 6e 20 24 76   variables $n $v
3a00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3a10: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
3a20: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
3a30: 73 65 69 66 20 7b 20 5b 72 65 67 65 78 70 20 7b  seif { [regexp {
3a40: 5e 5c 73 2a 28 5c 77 5c 53 2a 29 5c 73 2b 28 5c  ^\s*(\w\S*)\s+(\
3a50: 77 2b 29 5c 73 2b 28 5c 53 2e 2a 29 7d 20 24 6c  w+)\s+(\S.*)} $l
3a60: 69 6e 65 20 7b 7d 20 69 64 20 63 6d 64 20 63 6f  ine {} id cmd co
3a70: 6e 74 65 6e 74 5d 20 7d 20 7b 0d 0a 20 20 20 20  ntent] } {..    
3a80: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 64 69          if { [di
3a90: 63 74 20 65 78 69 73 74 73 20 24 64 20 69 64 73  ct exists $d ids
3aa0: 20 24 69 64 5d 20 7d 20 7b 0d 0a 20 20 20 20 20   $id] } {..     
3ab0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 5f 65             set_e
3ac0: 72 72 6f 72 20 24 64 20 24 69 64 20 22 72 65 70  rror $d $id "rep
3ad0: 65 61 74 65 64 20 69 64 20 69 6e 20 6c 69 6e 65  eated id in line
3ae0: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  "..            }
3af0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 70  ..            ap
3b00: 70 65 6e 64 5f 6c 69 6e 65 20 64 20 24 69 64 20  pend_line d $id 
3b10: 24 6c 69 6e 65 20 24 63 6f 6e 74 65 6e 74 0d 0a  $line $content..
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63 74              dict
3b30: 20 73 65 74 20 64 20 69 64 73 20 24 69 64 20 63   set d ids $id c
3b40: 6d 64 20 24 63 6d 64 0d 0a 20 20 20 20 20 20 20  md $cmd..       
3b50: 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20       dict set d 
3b60: 69 64 73 5f 73 68 6f 72 74 20 5b 6c 69 6e 64 65  ids_short [linde
3b70: 78 20 5b 73 70 6c 69 74 20 24 69 64 20 2e 5d 20  x [split $id .] 
3b80: 65 6e 64 5d 20 24 69 64 0d 0a 20 20 20 20 20 20  end] $id..      
3b90: 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 5b 72 65    } elseif { [re
3ba0: 67 65 78 70 20 7b 5e 5c 73 2a 5c 2e 28 5c 53 2b  gexp {^\s*\.(\S+
3bb0: 29 5c 73 2b 28 5c 53 2e 2a 29 7d 20 24 6c 69 6e  )\s+(\S.*)} $lin
3bc0: 65 20 7b 7d 20 63 6c 61 73 73 20 63 6f 6e 74 65  e {} class conte
3bd0: 6e 74 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  nt] } {..       
3be0: 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20       dict set d 
3bf0: 63 6c 61 73 73 65 73 20 24 63 6c 61 73 73 20 24  classes $class $
3c00: 63 6f 6e 74 65 6e 74 0d 0a 20 20 20 20 20 20 20  content..       
3c10: 20 7d 20 65 6c 73 65 69 66 20 7b 20 21 5b 72 65   } elseif { ![re
3c20: 67 65 78 70 20 7b 5e 5c 73 2a 24 7c 5e 5c 73 2a  gexp {^\s*$|^\s*
3c30: 23 7d 20 24 6c 69 6e 65 5d 20 7d 20 7b 0d 0a 20  #} $line] } {.. 
3c40: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
3c50: 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6e 65 20 27   "unknown line '
3c60: 24 6c 69 6e 65 27 22 0d 0a 20 20 20 20 20 20 20  $line'"..       
3c70: 20 7d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   }..        set 
3c80: 6c 69 6e 65 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  line ""..    }..
3c90: 20 20 20 20 0d 0a 23 23 23 23 23 23 23 23 23 23      ..##########
3ca0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ce0: 23 23 23 23 23 23 23 0d 0a 23 20 20 20 20 73 75  #######..#    su
3cf0: 62 73 74 69 74 75 74 65 20 61 6c 69 61 73 20 61  bstitute alias a
3d00: 6e 64 20 76 61 72 69 61 62 6c 65 73 0d 0a 23 23  nd variables..##
3d10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
3d60: 0a 20 20 20 20 0d 0a 20 20 20 20 66 6f 72 65 61  .    ..    forea
3d70: 63 68 20 69 64 20 5b 64 69 63 74 20 6b 65 79 73  ch id [dict keys
3d80: 20 5b 64 69 63 74 20 67 65 74 20 24 64 20 69 64   [dict get $d id
3d90: 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  s]] {..        s
3da0: 65 74 20 70 20 22 22 0d 0a 20 20 20 20 20 20 20  et p ""..       
3db0: 20 66 6f 72 65 61 63 68 20 22 6e 20 76 22 20 5b   foreach "n v" [
3dc0: 64 69 63 74 20 67 65 74 20 24 64 20 69 64 73 20  dict get $d ids 
3dd0: 24 69 64 20 70 72 6f 70 73 5d 20 7b 0d 0a 20 20  $id props] {..  
3de0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 20            set n 
3df0: 5b 64 69 63 74 5f 67 65 74 64 20 24 64 20 61 6c  [dict_getd $d al
3e00: 69 61 73 20 24 6e 20 24 6e 5d 0d 0a 20 20 20 20  ias $n $n]..    
3e10: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 72 65          if { [re
3e20: 67 65 78 70 20 7b 5e 5c 73 2a 3a 28 5c 77 5b 2d  gexp {^\s*:(\w[-
3e30: 5c 77 5d 2a 29 7d 20 24 76 20 7b 7d 20 76 61 72  \w]*)} $v {} var
3e40: 69 61 62 6c 65 5d 20 7d 20 7b 0d 0a 20 20 20 20  iable] } {..    
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
3e60: 20 21 5b 64 69 63 74 20 65 78 69 73 74 73 20 24   ![dict exists $
3e70: 64 20 76 61 72 69 61 62 6c 65 73 20 24 76 61 72  d variables $var
3e80: 69 61 62 6c 65 5d 20 7d 20 7b 0d 0a 20 20 20 20  iable] } {..    
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 73 65 74 5f 65 72 72 6f 72 20 24 64 20 24 69 64  set_error $d $id
3eb0: 20 22 75 6e 6b 6e 6f 77 6e 20 76 61 72 69 61 62   "unknown variab
3ec0: 6c 65 20 27 24 76 61 72 69 61 62 6c 65 27 22 20  le '$variable'" 
3ed0: 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ..             
3ee0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3ef0: 20 20 20 20 20 20 73 65 74 20 76 20 5b 64 69 63        set v [dic
3f00: 74 20 67 65 74 20 24 64 20 76 61 72 69 61 62 6c  t get $d variabl
3f10: 65 73 20 24 76 61 72 69 61 62 6c 65 5d 0d 0a 20  es $variable].. 
3f20: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
3f30: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 20            set v 
3f40: 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e  [subst -nocomman
3f50: 64 73 20 2d 6e 6f 76 61 72 69 61 62 6c 65 73 20  ds -novariables 
3f60: 24 76 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  $v]..           
3f70: 20 6c 61 70 70 65 6e 64 20 70 20 24 6e 20 24 76   lappend p $n $v
3f80: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
3f90: 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20       dict set d 
3fa0: 69 64 73 20 24 69 64 20 70 72 6f 70 73 20 24 70  ids $id props $p
3fb0: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0d 0a 23  ..    }..    ..#
3fc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3fd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3fe0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
3ff0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4010: 0d 0a 23 20 20 20 20 68 65 61 64 65 72 0d 0a 23  ..#    header..#
4020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4050: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4060: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4070: 0d 0a 20 20 20 20 0d 0a 20 20 20 20 69 66 20 7b  ..    ..    if {
4080: 20 21 5b 64 69 63 74 20 65 78 69 73 74 73 20 24   ![dict exists $
4090: 64 20 69 64 73 20 30 5d 20 7d 20 7b 0d 0a 20 20  d ids 0] } {..  
40a0: 20 20 20 20 20 20 65 72 72 6f 72 20 22 74 68 65        error "the
40b0: 72 65 20 69 73 20 6e 6f 20 73 76 67 6d 6c 20 68  re is no svgml h
40c0: 65 61 64 65 72 22 0d 0a 20 20 20 20 7d 0d 0a 20  eader"..    }.. 
40d0: 20 20 20 6c 61 73 73 69 67 6e 20 5b 64 69 63 74     lassign [dict
40e0: 20 67 65 74 20 24 64 20 69 64 73 20 30 20 62 62   get $d ids 0 bb
40f0: 6f 78 5d 20 2d 20 2d 20 77 69 64 74 68 20 68 65  ox] - - width he
4100: 69 67 68 74 0d 0a 20 20 20 20 0d 0a 20 20 20 20  ight..    ..    
4110: 73 65 74 20 78 6d 6c 48 20 22 3c 3f 78 6d 6c 20  set xmlH "<?xml 
4120: 76 65 72 73 69 6f 6e 3d 27 31 2e 30 27 20 65 6e  version='1.0' en
4130: 63 6f 64 69 6e 67 3d 27 55 54 46 2d 38 27 20 73  coding='UTF-8' s
4140: 74 61 6e 64 61 6c 6f 6e 65 3d 27 6e 6f 27 3f 3e  tandalone='no'?>
4150: 5c 6e 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20  \n"..    append 
4160: 78 6d 6c 48 20 22 3c 73 76 67 20 78 6d 6c 6e 73  xmlH "<svg xmlns
4170: 3d 27 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 2e  ='http://www.w3.
4180: 6f 72 67 2f 32 30 30 30 2f 73 76 67 27 20 22 0d  org/2000/svg' ".
4190: 0a 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 48  .    append xmlH
41a0: 20 22 78 6d 6c 6e 73 3a 78 6c 69 6e 6b 3d 27 68   "xmlns:xlink='h
41b0: 74 74 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67  ttp://www.w3.org
41c0: 2f 31 39 39 39 2f 78 6c 69 6e 6b 27 20 76 65 72  /1999/xlink' ver
41d0: 73 69 6f 6e 3d 27 31 2e 31 27 20 22 0d 0a 20 20  sion='1.1' "..  
41e0: 20 20 61 70 70 65 6e 64 20 78 6d 6c 48 20 22 77    append xmlH "w
41f0: 69 64 74 68 3d 27 24 77 69 64 74 68 27 20 68 65  idth='$width' he
4200: 69 67 68 74 3d 27 24 68 65 69 67 68 74 27 3e 5c  ight='$height'>\
4210: 6e 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78  n"..    append x
4220: 6d 6c 48 20 22 3c 21 2d 2d 63 72 65 61 74 65 64  mlH "<!--created
4230: 20 77 69 74 68 20 73 76 67 6d 6c 2d 52 61 6d 44   with svgml-RamD
4240: 65 62 75 67 67 65 72 20 3c 68 74 74 70 3a 2f 2f  ebugger <http://
4250: 77 77 77 2e 63 6f 6d 70 61 73 73 69 73 2e 63 6f  www.compassis.co
4260: 6d 2f 72 61 6d 64 65 62 75 67 67 65 72 3e 2d 2d  m/ramdebugger>--
4270: 3e 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78  >"..    append x
4280: 6d 6c 48 20 22 3c 64 65 66 73 3e 5c 6e 22 0d 0a  mlH "<defs>\n"..
4290: 20 20 20 20 0d 0a 20 20 20 20 73 65 74 20 73 74      ..    set st
42a0: 50 20 22 73 74 72 6f 6b 65 3a 23 30 30 30 30 30  P "stroke:#00000
42b0: 30 3b 73 74 72 6f 6b 65 2d 77 69 64 74 68 3a 31  0;stroke-width:1
42c0: 70 74 3b 66 69 6c 6c 3a 23 30 30 30 30 30 30 3b  pt;fill:#000000;
42d0: 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78 6d  "..    append xm
42e0: 6c 48 20 22 3c 6d 61 72 6b 65 72 20 6f 72 69 65  lH "<marker orie
42f0: 6e 74 3d 27 61 75 74 6f 27 20 72 65 66 59 3d 27  nt='auto' refY='
4300: 30 2e 30 27 20 72 65 66 58 3d 27 2d 34 2e 35 27  0.0' refX='-4.5'
4310: 20 69 64 3d 27 54 72 69 61 6e 67 6c 65 49 6e 4c   id='TriangleInL
4320: 27 20 73 74 79 6c 65 3d 27 6f 76 65 72 66 6c 6f  ' style='overflo
4330: 77 3a 76 69 73 69 62 6c 65 27 3e 5c 6e 22 0d 0a  w:visible'>\n"..
4340: 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 48 20      append xmlH 
4350: 22 3c 70 61 74 68 20 64 3d 27 4d 20 34 2e 35 2c  "<path d='M 4.5,
4360: 30 2e 30 20 4c 20 2d 32 2e 33 2c 34 2e 30 20 4c  0.0 L -2.3,4.0 L
4370: 20 2d 32 2e 33 2c 2d 34 2e 30 20 4c 20 34 2e 35   -2.3,-4.0 L 4.5
4380: 2c 30 2e 30 20 7a 27 20 22 0d 0a 20 20 20 20 61  ,0.0 z' "..    a
4390: 70 70 65 6e 64 20 78 6d 6c 48 20 22 66 69 6c 6c  ppend xmlH "fill
43a0: 3d 27 63 6f 6e 74 65 78 74 2d 73 74 72 6f 6b 65  ='context-stroke
43b0: 27 20 73 74 72 6f 6b 65 3d 27 63 6f 6e 74 65 78  ' stroke='contex
43c0: 74 2d 73 74 72 6f 6b 65 27 20 73 74 79 6c 65 3d  t-stroke' style=
43d0: 27 24 73 74 50 27 20 74 72 61 6e 73 66 6f 72 6d  '$stP' transform
43e0: 3d 27 73 63 61 6c 65 28 2d 31 2e 30 29 27 2f 3e  ='scale(-1.0)'/>
43f0: 5c 6e 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20  \n"..    append 
4400: 78 6d 6c 48 20 22 3c 2f 6d 61 72 6b 65 72 3e 5c  xmlH "</marker>\
4410: 6e 22 0d 0a 20 20 20 20 0d 0a 20 20 20 20 61 70  n"..    ..    ap
4420: 70 65 6e 64 20 78 6d 6c 48 20 22 3c 6d 61 72 6b  pend xmlH "<mark
4430: 65 72 20 6f 72 69 65 6e 74 3d 27 61 75 74 6f 27  er orient='auto'
4440: 20 72 65 66 59 3d 27 30 2e 30 27 20 72 65 66 58   refY='0.0' refX
4450: 3d 27 34 2e 35 27 20 69 64 3d 27 54 72 69 61 6e  ='4.5' id='Trian
4460: 67 6c 65 4f 75 74 4c 27 20 73 74 79 6c 65 3d 27  gleOutL' style='
4470: 6f 76 65 72 66 6c 6f 77 3a 76 69 73 69 62 6c 65  overflow:visible
4480: 27 3e 5c 6e 22 0d 0a 20 20 20 20 61 70 70 65 6e  '>\n"..    appen
4490: 64 20 78 6d 6c 48 20 22 3c 70 61 74 68 20 64 3d  d xmlH "<path d=
44a0: 27 4d 20 34 2e 35 2c 30 2e 30 20 4c 20 2d 32 2e  'M 4.5,0.0 L -2.
44b0: 33 2c 34 2e 30 20 4c 20 2d 32 2e 33 2c 2d 34 2e  3,4.0 L -2.3,-4.
44c0: 30 20 4c 20 34 2e 35 2c 30 2e 30 20 7a 27 20 22  0 L 4.5,0.0 z' "
44d0: 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c  ..    append xml
44e0: 48 20 22 66 69 6c 6c 3d 27 63 6f 6e 74 65 78 74  H "fill='context
44f0: 2d 73 74 72 6f 6b 65 27 20 73 74 72 6f 6b 65 3d  -stroke' stroke=
4500: 27 63 6f 6e 74 65 78 74 2d 73 74 72 6f 6b 65 27  'context-stroke'
4510: 20 73 74 79 6c 65 3d 27 24 73 74 50 27 2f 3e 5c   style='$stP'/>\
4520: 6e 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78  n"..    append x
4530: 6d 6c 48 20 22 3c 2f 6d 61 72 6b 65 72 3e 5c 6e  mlH "</marker>\n
4540: 22 0d 0a 20 20 20 20 0d 0a 20 20 20 20 61 70 70  "..    ..    app
4550: 65 6e 64 20 78 6d 6c 48 20 22 3c 6d 61 72 6b 65  end xmlH "<marke
4560: 72 20 6f 72 69 65 6e 74 3d 27 61 75 74 6f 27 20  r orient='auto' 
4570: 72 65 66 59 3d 27 30 2e 30 27 20 72 65 66 58 3d  refY='0.0' refX=
4580: 27 30 2e 30 27 20 69 64 3d 27 63 69 72 63 6c 65  '0.0' id='circle
4590: 27 20 73 74 79 6c 65 3d 27 6f 76 65 72 66 6c 6f  ' style='overflo
45a0: 77 3a 76 69 73 69 62 6c 65 27 3e 5c 6e 22 0d 0a  w:visible'>\n"..
45b0: 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 48 20      append xmlH 
45c0: 22 3c 63 69 72 63 6c 65 20 63 78 3d 27 30 2e 30  "<circle cx='0.0
45d0: 27 20 63 79 3d 27 30 27 20 72 3d 27 31 2e 35 27  ' cy='0' r='1.5'
45e0: 20 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78   "..    append x
45f0: 6d 6c 48 20 22 66 69 6c 6c 3d 27 63 6f 6e 74 65  mlH "fill='conte
4600: 78 74 2d 73 74 72 6f 6b 65 27 20 73 74 72 6f 6b  xt-stroke' strok
4610: 65 3d 27 63 6f 6e 74 65 78 74 2d 73 74 72 6f 6b  e='context-strok
4620: 65 27 20 73 74 79 6c 65 3d 27 24 73 74 50 27 2f  e' style='$stP'/
4630: 3e 5c 6e 22 0d 0a 20 20 20 20 61 70 70 65 6e 64  >\n"..    append
4640: 20 78 6d 6c 48 20 22 3c 2f 6d 61 72 6b 65 72 3e   xmlH "</marker>
4650: 5c 6e 22 0d 0a 20 20 20 20 0d 0a 20 20 20 20 61  \n"..    ..    a
4660: 70 70 65 6e 64 20 78 6d 6c 48 20 22 3c 66 69 6c  ppend xmlH "<fil
4670: 74 65 72 20 69 64 3d 27 73 68 61 64 6f 77 27 20  ter id='shadow' 
4680: 78 3d 27 2d 32 30 25 27 20 79 3d 27 2d 32 30 25  x='-20%' y='-20%
4690: 27 20 77 69 64 74 68 3d 27 31 34 30 25 27 20 68  ' width='140%' h
46a0: 65 69 67 68 74 3d 27 31 34 30 25 27 3e 22 0d 0a  eight='140%'>"..
46b0: 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 48 20      append xmlH 
46c0: 22 3c 66 65 47 61 75 73 73 69 61 6e 42 6c 75 72  "<feGaussianBlur
46d0: 20 73 74 64 44 65 76 69 61 74 69 6f 6e 3d 27 32   stdDeviation='2
46e0: 20 32 27 20 72 65 73 75 6c 74 3d 27 73 68 61 64   2' result='shad
46f0: 6f 77 27 2f 3e 22 0d 0a 20 20 20 20 61 70 70 65  ow'/>"..    appe
4700: 6e 64 20 78 6d 6c 48 20 22 3c 66 65 4f 66 66 73  nd xmlH "<feOffs
4710: 65 74 20 64 78 3d 27 36 27 20 64 79 3d 27 36 27  et dx='6' dy='6'
4720: 2f 3e 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20  />"..    append 
4730: 78 6d 6c 48 20 22 3c 2f 66 69 6c 74 65 72 3e 22  xmlH "</filter>"
4740: 0d 0a 20 20 20 20 0d 0a 20 20 20 20 61 70 70 65  ..    ..    appe
4750: 6e 64 20 78 6d 6c 48 20 22 3c 66 69 6c 74 65 72  nd xmlH "<filter
4760: 20 69 64 3d 27 67 6c 6f 77 27 20 78 3d 27 2d 33   id='glow' x='-3
4770: 30 25 27 20 79 3d 27 2d 33 30 25 27 20 77 69 64  0%' y='-30%' wid
4780: 74 68 3d 27 31 36 30 25 27 20 68 65 69 67 68 74  th='160%' height
4790: 3d 27 31 36 30 25 27 3e 22 0d 0a 20 20 20 20 61  ='160%'>"..    a
47a0: 70 70 65 6e 64 20 78 6d 6c 48 20 22 3c 66 65 47  ppend xmlH "<feG
47b0: 61 75 73 73 69 61 6e 42 6c 75 72 20 73 74 64 44  aussianBlur stdD
47c0: 65 76 69 61 74 69 6f 6e 3d 27 31 30 20 31 30 27  eviation='10 10'
47d0: 20 72 65 73 75 6c 74 3d 27 67 6c 6f 77 27 2f 3e   result='glow'/>
47e0: 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78 6d  "..    append xm
47f0: 6c 48 20 22 3c 66 65 4d 65 72 67 65 3e 22 0d 0a  lH "<feMerge>"..
4800: 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 48 20      append xmlH 
4810: 22 3c 66 65 4d 65 72 67 65 4e 6f 64 65 20 69 6e  "<feMergeNode in
4820: 3d 27 67 6c 6f 77 27 2f 3e 22 0d 0a 20 20 20 20  ='glow'/>"..    
4830: 61 70 70 65 6e 64 20 78 6d 6c 48 20 22 3c 66 65  append xmlH "<fe
4840: 4d 65 72 67 65 4e 6f 64 65 20 69 6e 3d 27 67 6c  MergeNode in='gl
4850: 6f 77 27 2f 3e 22 0d 0a 20 20 20 20 61 70 70 65  ow'/>"..    appe
4860: 6e 64 20 78 6d 6c 48 20 22 3c 66 65 4d 65 72 67  nd xmlH "<feMerg
4870: 65 4e 6f 64 65 20 69 6e 3d 27 67 6c 6f 77 27 2f  eNode in='glow'/
4880: 3e 22 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78  >"..    append x
4890: 6d 6c 48 20 22 3c 2f 66 65 4d 65 72 67 65 3e 22  mlH "</feMerge>"
48a0: 0d 0a 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c  ..    append xml
48b0: 48 20 22 3c 2f 66 69 6c 74 65 72 3e 22 0d 0a 20  H "</filter>".. 
48c0: 20 20 20 0d 0a 20 20 20 20 64 69 63 74 20 66 6f     ..    dict fo
48d0: 72 20 22 63 6c 61 73 73 20 63 6f 6e 74 65 6e 74  r "class content
48e0: 22 20 5b 64 69 63 74 20 67 65 74 20 24 64 20 63  " [dict get $d c
48f0: 6c 61 73 73 65 73 5d 20 7b 0d 0a 20 20 20 20 20  lasses] {..     
4900: 20 20 20 73 65 74 20 63 20 22 22 0d 0a 20 20 20     set c ""..   
4910: 20 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e       foreach con
4920: 74 65 6e 74 49 20 5b 73 70 6c 69 74 20 24 63 6f  tentI [split $co
4930: 6e 74 65 6e 74 20 22 3b 22 5d 20 7b 0d 0a 20 20  ntent ";"] {..  
4940: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24            if { $
4950: 63 6f 6e 74 65 6e 74 49 20 65 71 20 22 22 20 7d  contentI eq "" }
4960: 20 7b 20 63 6f 6e 74 69 6e 75 65 20 7d 0d 0a 20   { continue }.. 
4970: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73 69             lassi
4980: 67 6e 20 5b 73 70 6c 69 74 20 24 63 6f 6e 74 65  gn [split $conte
4990: 6e 74 49 20 3a 5d 20 6e 20 76 0d 0a 20 20 20 20  ntI :] n v..    
49a0: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 6e 20          if { $n 
49b0: 65 71 20 22 66 69 6c 6c 22 20 26 26 20 5b 72 65  eq "fill" && [re
49c0: 67 65 78 70 20 7b 72 61 64 69 61 6c 2d 67 72 61  gexp {radial-gra
49d0: 64 69 65 6e 74 5c 28 28 2e 2a 29 5c 29 7d 20 24  dient\((.*)\)} $
49e0: 76 20 7b 7d 20 76 73 5d 20 7d 20 7b 0d 0a 20 20  v {} vs] } {..  
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
4a00: 73 73 69 67 6e 20 5b 73 70 6c 69 74 20 24 76 73  ssign [split $vs
4a10: 20 2c 5d 20 63 6f 6c 6f 72 31 20 63 6f 6c 6f 72   ,] color1 color
4a20: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
4a30: 20 20 20 69 66 20 7b 20 21 5b 69 6e 66 6f 20 65     if { ![info e
4a40: 78 69 73 74 73 20 72 61 64 69 61 6c 5f 67 72 61  xists radial_gra
4a50: 64 69 65 6e 74 5d 20 7d 20 7b 0d 0a 20 20 20 20  dient] } {..    
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 73 65 74 20 72 61 64 69 61 6c 5f 67 72 61 64 69  set radial_gradi
4a80: 65 6e 74 20 31 0d 0a 20 20 20 20 20 20 20 20 20  ent 1..         
4a90: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
4aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4ab0: 20 20 20 20 20 69 6e 63 72 20 72 61 64 69 61 6c       incr radial
4ac0: 5f 67 72 61 64 69 65 6e 74 0d 0a 20 20 20 20 20  _gradient..     
4ad0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
4af0: 74 20 69 64 20 72 61 64 69 61 6c 5f 67 72 61 64  t id radial_grad
4b00: 69 65 6e 74 24 72 61 64 69 61 6c 5f 67 72 61 64  ient$radial_grad
4b10: 69 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20  ient..          
4b20: 20 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c        append xml
4b30: 48 20 22 3c 72 61 64 69 61 6c 47 72 61 64 69 65  H "<radialGradie
4b40: 6e 74 20 69 64 3d 27 24 69 64 27 20 63 78 3d 27  nt id='$id' cx='
4b50: 35 30 25 27 20 63 79 3d 27 35 30 25 27 20 72 3d  50%' cy='50%' r=
4b60: 27 35 30 25 27 20 66 78 3d 27 35 30 25 27 20 66  '50%' fx='50%' f
4b70: 79 3d 27 35 30 25 27 3e 5c 6e 22 0d 0a 20 20 20  y='50%'>\n"..   
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
4b90: 65 6e 64 20 78 6d 6c 48 20 22 3c 73 74 6f 70 20  end xmlH "<stop 
4ba0: 6f 66 66 73 65 74 3d 27 30 25 27 20 73 74 79 6c  offset='0%' styl
4bb0: 65 3d 27 73 74 6f 70 2d 63 6f 6c 6f 72 3a 24 63  e='stop-color:$c
4bc0: 6f 6c 6f 72 31 3b 73 74 6f 70 2d 6f 70 61 63 69  olor1;stop-opaci
4bd0: 74 79 3a 30 27 20 2f 3e 5c 6e 22 0d 0a 20 20 20  ty:0' />\n"..   
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
4bf0: 65 6e 64 20 78 6d 6c 48 20 22 3c 73 74 6f 70 20  end xmlH "<stop 
4c00: 6f 66 66 73 65 74 3d 27 31 30 30 25 27 20 73 74  offset='100%' st
4c10: 79 6c 65 3d 27 73 74 6f 70 2d 63 6f 6c 6f 72 3a  yle='stop-color:
4c20: 24 63 6f 6c 6f 72 32 3b 73 74 6f 70 2d 6f 70 61  $color2;stop-opa
4c30: 63 69 74 79 3a 31 27 20 2f 3e 5c 6e 22 0d 0a 20  city:1' />\n".. 
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
4c50: 70 70 65 6e 64 20 78 6d 6c 48 20 22 3c 2f 72 61  ppend xmlH "</ra
4c60: 64 69 61 6c 47 72 61 64 69 65 6e 74 3e 5c 6e 22  dialGradient>\n"
4c70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4c80: 20 20 73 65 74 20 76 20 22 75 72 6c 28 23 24 69    set v "url(#$i
4c90: 64 29 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d)"..           
4ca0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
4cb0: 61 70 70 65 6e 64 20 63 20 22 24 6e 3a 24 76 3b  append c "$n:$v;
4cc0: 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  "..        }..  
4cd0: 20 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64        dict set d
4ce0: 20 63 6c 61 73 73 65 73 20 24 63 6c 61 73 73 20   classes $class 
4cf0: 24 63 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0d  $c..    }..    .
4d00: 0a 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 48  .    append xmlH
4d10: 20 22 3c 2f 64 65 66 73 3e 5c 6e 22 0d 0a 20 20   "</defs>\n"..  
4d20: 20 20 20 20 20 20 0d 0a 23 23 23 23 23 23 23 23        ..########
4d30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d60: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d70: 23 23 23 23 23 23 23 23 23 0d 0a 23 20 20 20 20  #########..#    
4d80: 6c 6f 6f 70 20 6f 6e 20 65 6e 74 69 74 69 65 73  loop on entities
4d90: 2e 20 54 68 65 20 74 72 69 65 73 20 61 72 65 20  . The tries are 
4da0: 68 65 72 65 20 74 6f 20 73 6f 6c 76 65 20 64 65  here to solve de
4db0: 70 65 6e 64 65 6e 63 69 65 73 20 6f 66 20 64 65  pendencies of de
4dc0: 70 65 6e 64 65 6e 63 69 65 73 0d 0a 23 23 23 23  pendencies..####
4dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4df0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 20  #############.. 
4e20: 20 20 20 0d 0a 20 20 20 20 66 6f 72 20 7b 20 73     ..    for { s
4e30: 65 74 20 69 5f 74 72 79 20 30 20 7d 20 7b 20 24  et i_try 0 } { $
4e40: 69 5f 74 72 79 20 3c 20 31 30 20 7d 20 7b 20 69  i_try < 10 } { i
4e50: 6e 63 72 20 69 5f 74 72 79 20 7d 20 7b 0d 0a 20  ncr i_try } {.. 
4e60: 20 20 20 20 20 20 20 73 65 74 20 78 6d 6c 20 24         set xml $
4e70: 78 6d 6c 48 0d 0a 20 20 20 20 20 20 20 20 64 69  xmlH..        di
4e80: 63 74 20 73 65 74 20 64 20 6e 65 65 64 73 5f 72  ct set d needs_r
4e90: 65 63 61 6c 63 75 6c 61 74 65 20 30 0d 0a 20 20  ecalculate 0..  
4ea0: 20 20 20 20 20 20 64 69 63 74 20 66 6f 72 20 22        dict for "
4eb0: 69 64 20 65 6e 74 22 20 5b 64 69 63 74 20 67 65  id ent" [dict ge
4ec0: 74 20 24 64 20 69 64 73 5d 20 7b 0d 0a 20 20 20  t $d ids] {..   
4ed0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 69           if { $i
4ee0: 64 20 69 6e 20 22 30 20 5f 5f 52 4f 4f 54 22 20  d in "0 __ROOT" 
4ef0: 7d 20 7b 20 63 6f 6e 74 69 6e 75 65 20 7d 0d 0a  } { continue }..
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 31              if 1
4f10: 20 7b 20 70 75 74 73 20 22 24 69 5f 74 72 79 20   { puts "$i_try 
4f20: 20 20 5b 64 69 63 74 20 67 65 74 20 24 65 6e 74    [dict get $ent
4f30: 20 6c 69 6e 65 5d 22 20 7d 0d 0a 20 20 20 20 20   line]" }..     
4f40: 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20         ..       
4f50: 20 20 20 20 20 73 65 74 20 72 65 74 20 5b 63 61       set ret [ca
4f60: 74 63 68 20 7b 20 63 72 65 61 74 65 5f 65 6e 74  tch { create_ent
4f70: 69 74 79 20 24 69 64 20 22 22 20 7d 20 73 74 72  ity $id "" } str
4f80: 20 6f 70 74 73 5d 0d 0a 20 20 20 20 20 20 20 20   opts]..        
4f90: 20 20 20 20 69 66 20 7b 20 24 72 65 74 20 21 3d      if { $ret !=
4fa0: 20 30 20 26 26 20 24 72 65 74 20 21 3d 20 34 20   0 && $ret != 4 
4fb0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
4fc0: 20 20 20 20 20 65 72 72 6f 72 20 24 73 74 72 20       error $str 
4fd0: 5b 64 69 63 74 20 67 65 74 20 24 6f 70 74 73 20  [dict get $opts 
4fe0: 2d 65 72 72 6f 72 69 6e 66 6f 5d 0d 0a 20 20 20  -errorinfo]..   
4ff0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
5000: 66 20 7b 20 24 72 65 74 20 3d 3d 20 34 20 7d 20  f { $ret == 4 } 
5010: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5020: 20 20 20 64 69 63 74 20 73 65 74 20 64 20 6e 65     dict set d ne
5030: 65 64 73 5f 72 65 63 61 6c 63 75 6c 61 74 65 20  eds_recalculate 
5040: 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1..            }
5050: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
5060: 20 20 20 20 20 69 66 20 7b 20 21 5b 64 69 63 74       if { ![dict
5070: 20 67 65 74 20 24 64 20 6e 65 65 64 73 5f 72 65   get $d needs_re
5080: 63 61 6c 63 75 6c 61 74 65 5d 20 7d 20 7b 0d 0a  calculate] } {..
5090: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
50a0: 6b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  k..        }..  
50b0: 20 20 7d 0d 0a 20 20 20 20 61 70 70 65 6e 64 20    }..    append 
50c0: 78 6d 6c 20 22 3c 2f 73 76 67 3e 5c 6e 22 0d 0a  xml "</svg>\n"..
50d0: 20 20 20 20 72 65 74 75 72 6e 20 24 78 6d 6c 0d      return $xml.
50e0: 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 73 76 67 6d 6c  .}....proc svgml
50f0: 3a 3a 72 65 73 6f 6c 76 65 5f 69 64 20 7b 20 69  ::resolve_id { i
5100: 64 20 69 64 5f 66 72 6f 6d 20 7d 20 7b 0d 0a 20  d id_from } {.. 
5110: 20 20 20 76 61 72 69 61 62 6c 65 20 64 0d 0a 20     variable d.. 
5120: 20 20 20 0d 0a 20 20 20 20 69 66 20 7b 20 24 69     ..    if { $i
5130: 64 20 65 71 20 22 22 20 7d 20 7b 20 72 65 74 75  d eq "" } { retu
5140: 72 6e 20 30 20 7d 0d 0a 20 20 20 20 0d 0a 20 20  rn 0 }..    ..  
5150: 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65 78    if { ![dict ex
5160: 69 73 74 73 20 24 64 20 69 64 73 20 24 69 64 5d  ists $d ids $id]
5170: 20 26 26 20 5b 64 69 63 74 20 65 78 69 73 74 73   && [dict exists
5180: 20 24 64 20 69 64 73 5f 73 68 6f 72 74 20 24 69   $d ids_short $i
5190: 64 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  d] } {..        
51a0: 73 65 74 20 69 64 20 5b 64 69 63 74 20 67 65 74  set id [dict get
51b0: 20 24 64 20 69 64 73 5f 73 68 6f 72 74 20 24 69   $d ids_short $i
51c0: 64 5d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69  d]..    }..    i
51d0: 66 20 7b 20 21 5b 64 69 63 74 20 65 78 69 73 74  f { ![dict exist
51e0: 73 20 24 64 20 69 64 73 20 24 69 64 5d 20 7d 20  s $d ids $id] } 
51f0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 5f 65  {..        set_e
5200: 72 72 6f 72 20 24 64 20 24 69 64 5f 66 72 6f 6d  rror $d $id_from
5210: 20 22 75 6e 6b 6e 6f 77 6e 20 69 64 20 23 24 69   "unknown id #$i
5220: 64 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 72  d"..    }..    r
5230: 65 74 75 72 6e 20 24 69 64 0d 0a 7d 0d 0a 0d 0a  eturn $id..}....
5240: 70 72 6f 63 20 73 76 67 6d 6c 3a 3a 63 61 6c 63  proc svgml::calc
5250: 75 6c 61 74 65 5f 70 61 72 65 6e 74 20 7b 20 69  ulate_parent { i
5260: 64 20 7d 20 7b 0d 0a 20 20 20 20 76 61 72 69 61  d } {..    varia
5270: 62 6c 65 20 64 0d 0a 20 20 20 20 0d 0a 20 20 20  ble d..    ..   
5280: 20 73 65 74 20 70 61 72 65 6e 74 20 5b 6a 6f 69   set parent [joi
5290: 6e 20 5b 6c 72 61 6e 67 65 20 5b 73 70 6c 69 74  n [lrange [split
52a0: 20 24 69 64 20 2e 5d 20 30 20 65 6e 64 2d 31 5d   $id .] 0 end-1]
52b0: 20 22 2e 22 5d 0d 0a 20 20 20 20 72 65 74 75 72   "."]..    retur
52c0: 6e 20 5b 72 65 73 6f 6c 76 65 5f 69 64 20 24 70  n [resolve_id $p
52d0: 61 72 65 6e 74 20 24 69 64 5d 0d 0a 7d 0d 0a 70  arent $id]..}..p
52e0: 72 6f 63 20 73 76 67 6d 6c 3a 3a 63 6f 70 79 5f  roc svgml::copy_
52f0: 6f 70 65 72 61 74 69 6f 6e 20 7b 20 69 64 20 70  operation { id p
5300: 6e 74 20 6e 70 6f 69 6e 74 20 63 6f 70 79 5f 69  nt npoint copy_i
5310: 6e 66 6f 20 7d 20 7b 0d 0a 20 20 20 20 76 61 72  nfo } {..    var
5320: 69 61 62 6c 65 20 64 0d 0a 0d 0a 20 20 20 20 73  iable d....    s
5330: 65 74 20 63 6d 64 20 5b 64 69 63 74 20 67 65 74  et cmd [dict get
5340: 20 24 64 20 69 64 73 20 24 69 64 20 63 6d 64 5d   $d ids $id cmd]
5350: 0d 0a 20 20 20 20 73 65 74 20 63 20 5b 64 69 63  ..    set c [dic
5360: 74 5f 67 65 74 64 20 24 63 6f 70 79 5f 69 6e 66  t_getd $copy_inf
5370: 6f 20 6f 70 65 72 61 74 69 6f 6e 73 20 22 22 5d  o operations ""]
5380: 0d 0a 20 20 20 20 0d 0a 20 20 20 20 6c 61 73 73  ..    ..    lass
5390: 69 67 6e 20 24 70 6e 74 20 6e 20 78 20 79 20 7a  ign $pnt n x y z
53a0: 20 70 61 72 61 6d 65 74 65 72 73 0d 0a 20 20 20   parameters..   
53b0: 20 73 65 74 20 70 20 5b 6c 69 73 74 20 24 78 20   set p [list $x 
53c0: 24 79 5d 0d 0a 20 20 20 20 73 65 74 20 70 5f 70  $y]..    set p_p
53d0: 72 65 76 20 24 70 0d 0a 20 20 20 20 0d 0a 20 20  rev $p..    ..  
53e0: 20 20 69 66 20 7b 20 24 6e 20 6e 69 20 22 7a 20    if { $n ni "z 
53f0: 5a 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  Z" } {..        
5400: 66 6f 72 20 7b 20 73 65 74 20 69 20 30 20 7d 20  for { set i 0 } 
5410: 7b 20 24 69 20 3c 20 5b 6c 6c 65 6e 67 74 68 20  { $i < [llength 
5420: 24 63 5d 20 7d 20 7b 20 69 6e 63 72 20 69 20 7d  $c] } { incr i }
5430: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5440: 73 65 74 20 63 49 20 5b 6c 69 6e 64 65 78 20 24  set cI [lindex $
5450: 63 20 24 69 5d 0d 0a 20 20 20 20 20 20 20 20 20  c $i]..         
5460: 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 73 69     if { [dict si
5470: 7a 65 20 5b 64 69 63 74 20 67 65 74 20 24 63 49  ze [dict get $cI
5480: 20 64 65 6c 74 61 5f 70 6f 69 6e 74 73 5d 5d 20   delta_points]] 
5490: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
54a0: 20 20 20 20 20 73 65 74 20 64 69 73 74 5f 6d 61       set dist_ma
54b0: 78 20 30 2e 30 0d 0a 20 20 20 20 20 20 20 20 20  x 0.0..         
54c0: 20 20 20 20 20 20 20 73 65 74 20 64 65 6c 74 61         set delta
54d0: 73 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  s ""..          
54e0: 20 20 20 20 20 20 64 69 63 74 20 66 6f 72 20 22        dict for "
54f0: 70 4c 20 76 4c 22 20 5b 64 69 63 74 20 67 65 74  pL vL" [dict get
5500: 20 24 63 49 20 64 65 6c 74 61 5f 70 6f 69 6e 74   $cI delta_point
5510: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  s] {..          
5520: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69            set di
5530: 73 74 20 5b 6d 3a 3a 6e 6f 72 6d 5f 74 77 6f 20  st [m::norm_two 
5540: 5b 6d 3a 3a 73 75 62 20 24 70 20 24 70 4c 5d 5d  [m::sub $p $pL]]
5550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5560: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65        lappend de
5570: 6c 74 61 73 20 24 64 69 73 74 20 24 76 4c 0d 0a  ltas $dist $vL..
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 20 69 66 20 7b 20 24 64 69 73 74 20 3e      if { $dist >
55a0: 20 24 64 69 73 74 5f 6d 61 78 20 7d 20 7b 0d 0a   $dist_max } {..
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 20 20 20 20 20 73 65 74 20 64 69 73 74          set dist
55d0: 5f 6d 61 78 20 24 64 69 73 74 0d 0a 20 20 20 20  _max $dist..    
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
5600: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
5610: 20 20 20 20 20 20 73 65 74 20 64 65 6c 74 61 20        set delta 
5620: 22 30 20 30 22 0d 0a 20 20 20 20 20 20 20 20 20  "0 0"..         
5630: 20 20 20 20 20 20 20 73 65 74 20 66 61 63 5f 74         set fac_t
5640: 6f 74 20 30 2e 30 0d 0a 20 20 20 20 20 20 20 20  ot 0.0..        
5650: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
5660: 22 64 69 73 74 20 76 22 20 24 64 65 6c 74 61 73  "dist v" $deltas
5670: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5680: 20 20 20 20 20 20 20 20 73 65 74 20 66 61 63 20          set fac 
5690: 5b 65 78 70 72 20 7b 28 24 64 69 73 74 5f 6d 61  [expr {($dist_ma
56a0: 78 2d 24 64 69 73 74 29 2a 2a 33 7d 5d 0d 0a 20  x-$dist)**3}].. 
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 20 20 20 73 65 74 20 64 65 6c 74 61 20 5b 6d 3a     set delta [m:
56d0: 3a 61 78 70 79 20 24 66 61 63 20 24 76 20 24 64  :axpy $fac $v $d
56e0: 65 6c 74 61 5d 0d 0a 20 20 20 20 20 20 20 20 20  elta]..         
56f0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66             set f
5700: 61 63 5f 74 6f 74 20 5b 65 78 70 72 20 7b 24 66  ac_tot [expr {$f
5710: 61 63 5f 74 6f 74 2b 24 66 61 63 7d 5d 20 20 20  ac_tot+$fac}]   
5720: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5730: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
5740: 20 20 20 20 20 69 66 20 7b 20 24 66 61 63 5f 74       if { $fac_t
5750: 6f 74 20 21 3d 20 30 20 7d 20 7b 0d 0a 20 20 20  ot != 0 } {..   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 73 65 74 20 64 65 6c 74 61 20 5b 6d 3a 3a 73   set delta [m::s
5780: 63 61 6c 65 20 5b 65 78 70 72 20 7b 31 2e 30 2f  cale [expr {1.0/
5790: 24 66 61 63 5f 74 6f 74 7d 5d 20 24 64 65 6c 74  $fac_tot}] $delt
57a0: 61 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  a]..            
57b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
57c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
57e0: 20 64 65 6c 74 61 20 5b 64 69 63 74 20 67 65 74   delta [dict get
57f0: 20 24 63 49 20 64 65 6c 74 61 5d 0d 0a 20 20 20   $cI delta]..   
5800: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5810: 20 20 20 20 20 20 20 20 73 65 74 20 70 20 5b 6d          set p [m
5820: 3a 3a 61 64 64 20 24 70 20 24 64 65 6c 74 61 5d  ::add $p $delta]
5830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
5840: 20 7b 20 24 69 20 3c 20 5b 6c 6c 65 6e 67 74 68   { $i < [llength
5850: 20 24 63 5d 2d 31 20 7d 20 7b 0d 0a 20 20 20 20   $c]-1 } {..    
5860: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
5870: 70 5f 70 72 65 76 20 5b 6d 3a 3a 61 64 64 20 24  p_prev [m::add $
5880: 70 5f 70 72 65 76 20 24 64 65 6c 74 61 5d 20 20  p_prev $delta]  
5890: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
58a0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
58b0: 7d 0d 0a 20 20 20 20 0d 0a 20 20 20 20 69 66 20  }..    ..    if 
58c0: 7b 20 5b 64 69 63 74 20 67 65 74 20 24 63 6f 70  { [dict get $cop
58d0: 79 5f 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 5d 20  y_info connect] 
58e0: 6e 65 20 22 22 20 26 26 20 24 63 6d 64 20 6e 65  ne "" && $cmd ne
58f0: 20 22 63 6f 70 79 22 20 7d 20 7b 0d 0a 20 20 20   "copy" } {..   
5900: 20 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c       regsub -all
5910: 20 7b 5c 2e 7d 20 20 5b 64 69 63 74 20 67 65 74   {\.}  [dict get
5920: 20 24 63 6f 70 79 5f 69 6e 66 6f 20 69 64 5d 20   $copy_info id] 
5930: 5f 20 69 64 46 0d 0a 20 20 20 20 20 20 20 20 73  _ idF..        s
5940: 65 74 20 69 64 43 20 5f 5f 63 6f 70 79 5f 24 7b  et idC __copy_${
5950: 69 64 46 7d 5f 24 7b 6e 70 6f 69 6e 74 7d 5f 5b  idF}_${npoint}_[
5960: 6c 6c 65 6e 67 74 68 20 24 63 5d 0d 0a 0d 0a 20  llength $c].... 
5970: 20 20 20 20 20 20 20 73 65 74 20 70 4c 69 73 74         set pList
5980: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 69 66 20   ""..        if 
5990: 7b 20 5b 64 69 63 74 20 67 65 74 20 24 63 6f 70  { [dict get $cop
59a0: 79 5f 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 5d 20  y_info connect] 
59b0: 65 71 20 22 70 6f 69 6e 74 73 22 20 7d 20 7b 0d  eq "points" } {.
59c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
59d0: 7b 20 24 6e 20 69 6e 20 22 70 6f 69 6e 74 20 4d  { $n in "point M
59e0: 20 4c 20 6c 20 41 20 61 22 20 7d 20 7b 0d 0a 20   L l A a" } {.. 
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5a00: 65 74 20 70 4c 69 73 74 20 22 70 6f 69 6e 74 3a  et pList "point:
5a10: 23 5f 5f 52 4f 4f 54 2c 5b 6a 6f 69 6e 20 24 70  #__ROOT,[join $p
5a20: 5f 70 72 65 76 20 2c 5d 2c 23 5f 5f 52 4f 4f 54  _prev ,],#__ROOT
5a30: 2c 5b 6a 6f 69 6e 20 24 70 20 2c 5d 3b 22 0d 0a  ,[join $p ,];"..
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
5a50: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
5a60: 7b 20 5b 64 69 63 74 20 67 65 74 20 24 63 6f 70  { [dict get $cop
5a70: 79 5f 69 6e 66 6f 20 63 6f 6e 6e 65 63 74 5d 20  y_info connect] 
5a80: 65 71 20 22 6c 69 6e 65 73 22 20 7d 20 7b 0d 0a  eq "lines" } {..
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
5aa0: 6f 6b 20 22 70 6f 69 6e 74 20 4d 20 4c 20 6c 20  ok "point M L l 
5ab0: 41 20 61 20 7a 20 5a 22 0d 0a 20 20 20 20 20 20  A a z Z"..      
5ac0: 20 20 20 20 20 20 69 66 20 7b 20 24 6e 20 69 6e        if { $n in
5ad0: 20 24 6f 6b 20 26 26 20 5b 64 69 63 74 20 65 78   $ok && [dict ex
5ae0: 69 73 74 73 20 24 64 20 70 72 65 76 5f 63 6f 70  ists $d prev_cop
5af0: 79 5f 69 6e 66 6f 20 24 69 64 46 5d 20 26 26 20  y_info $idF] && 
5b00: 24 6e 70 6f 69 6e 74 20 3e 20 30 20 7d 20 7b 0d  $npoint > 0 } {.
5b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5b20: 20 73 65 74 20 63 20 5b 64 69 63 74 5f 67 65 74   set c [dict_get
5b30: 64 20 24 64 20 70 72 65 76 5f 63 6f 70 79 5f 69  d $d prev_copy_i
5b40: 6e 66 6f 20 24 69 64 46 20 22 22 5d 0d 0a 20 20  nfo $idF ""]..  
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5b60: 20 7b 20 24 6e 20 69 6e 20 22 70 6f 69 6e 74 20   { $n in "point 
5b70: 4d 20 4c 20 6c 20 41 20 61 22 20 7d 20 7b 0d 0a  M L l A a" } {..
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 20 5b 6c      lappend c [l
5ba0: 69 73 74 20 24 6e 20 24 70 5f 70 72 65 76 20 24  ist $n $p_prev $
5bb0: 70 20 24 70 6e 74 5d 0d 0a 20 20 20 20 20 20 20  p $pnt]..       
5bc0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
5bd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5be0: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63         lappend c
5bf0: 20 5b 64 69 63 74 20 67 65 74 20 24 64 20 70 72   [dict get $d pr
5c00: 65 76 5f 63 6f 70 79 5f 69 6e 66 6f 30 20 24 69  ev_copy_info0 $i
5c10: 64 46 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dF]..           
5c20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
5c30: 20 20 20 20 20 20 20 20 73 65 74 20 70 4c 69 73          set pLis
5c40: 74 20 22 70 6f 69 6e 74 3a 22 0d 0a 20 20 20 20  t "point:"..    
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
5c60: 69 64 78 20 30 0d 0a 20 20 20 20 20 20 20 20 20  idx 0..         
5c70: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 69         foreach i
5c80: 20 24 63 20 7b 0d 0a 20 20 20 20 20 20 20 20 20   $c {..         
5c90: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73 69             lassi
5ca0: 67 6e 20 24 69 20 6e 4c 20 70 5f 70 72 65 76 4c  gn $i nL p_prevL
5cb0: 20 70 4c 20 70 6e 74 4c 0d 0a 20 20 20 20 20 20   pL pntL..      
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5cd0: 20 7b 20 24 69 64 78 20 3d 3d 20 30 20 7c 7c 20   { $idx == 0 || 
5ce0: 24 6e 4c 20 69 6e 20 22 70 6f 69 6e 74 20 4d 22  $nL in "point M"
5cf0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
5d10: 70 65 6e 64 20 70 4c 69 73 74 20 23 5f 5f 52 4f  pend pList #__RO
5d20: 4f 54 2c 5b 6a 6f 69 6e 20 24 70 5f 70 72 65 76  OT,[join $p_prev
5d30: 4c 20 2c 5d 2c 0d 0a 20 20 20 20 20 20 20 20 20  L ,],..         
5d40: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
5d50: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
5d70: 65 6e 64 20 70 4c 69 73 74 20 22 23 5f 5f 52 4f  end pList "#__RO
5d80: 4f 54 2c 24 6e 4c 2c 22 0d 0a 20 20 20 20 20 20  OT,$nL,"..      
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5da0: 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 24    if { [lindex $
5db0: 70 6e 74 4c 20 34 5d 20 6e 65 20 22 22 20 7d 20  pntL 4] ne "" } 
5dc0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5de0: 70 70 65 6e 64 20 70 4c 69 73 74 20 22 5b 6a 6f  ppend pList "[jo
5df0: 69 6e 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 4c  in [lindex $pntL
5e00: 20 34 5d 20 2c 5d 2c 22 0d 0a 20 20 20 20 20 20   4] ,],"..      
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e20: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
5e40: 65 6e 64 20 70 4c 69 73 74 20 22 5b 6a 6f 69 6e  end pList "[join
5e50: 20 24 70 5f 70 72 65 76 4c 20 2c 5d 2c 22 0d 0a   $p_prevL ,],"..
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
5e80: 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
5e90: 69 64 78 0d 0a 20 20 20 20 20 20 20 20 20 20 20  idx..           
5ea0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
5eb0: 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20          lassign 
5ec0: 22 22 20 6e 4c 5f 70 72 65 76 20 70 6e 74 5f 70  "" nL_prev pnt_p
5ed0: 72 65 76 4c 0d 0a 20 20 20 20 20 20 20 20 20 20  revL..          
5ee0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 69 20        foreach i 
5ef0: 5b 6c 72 65 76 65 72 73 65 20 24 63 5d 20 7b 0d  [lreverse $c] {.
5f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f10: 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 69 20       lassign $i 
5f20: 6e 4c 20 70 5f 70 72 65 76 4c 20 70 4c 20 70 6e  nL p_prevL pL pn
5f30: 74 4c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  tL..            
5f40: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 69 64          if { $id
5f50: 78 20 3d 3d 20 30 20 7c 7c 20 24 6e 4c 20 69 6e  x == 0 || $nL in
5f60: 20 22 70 6f 69 6e 74 20 4d 22 20 7d 20 7b 0d 0a   "point M" } {..
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 70          append p
5f90: 4c 69 73 74 20 23 5f 5f 52 4f 4f 54 2c 5b 6a 6f  List #__ROOT,[jo
5fa0: 69 6e 20 24 70 4c 20 2c 5d 2c 0d 0a 20 20 20 20  in $pL ,],..    
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 61 70 70 65 6e 64 20 70 4c 69 73 74 20 22    append pList "
5ff0: 23 5f 5f 52 4f 4f 54 2c 24 6e 4c 2c 22 0d 0a 20  #__ROOT,$nL,".. 
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e         if { [lin
6020: 64 65 78 20 24 70 6e 74 5f 70 72 65 76 4c 20 34  dex $pnt_prevL 4
6030: 5d 20 6e 65 20 22 22 20 7d 20 7b 0d 0a 20 20 20  ] ne "" } {..   
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 72           set par
6060: 61 6d 73 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74  ams [lindex $pnt
6070: 5f 70 72 65 76 4c 20 34 5d 0d 0a 20 20 20 20 20  _prevL 4]..     
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 20 20 20 20 6c 73 65 74 20 70 61 72 61         lset para
60a0: 6d 73 20 33 20 5b 65 78 70 72 20 7b 28 5b 6c 69  ms 3 [expr {([li
60b0: 6e 64 65 78 20 24 70 61 72 61 6d 73 20 33 5d 29  ndex $params 3])
60c0: 3f 30 3a 31 7d 5d 0d 0a 20 20 20 20 20 20 20 20  ?0:1}]..        
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 61 70 70 65 6e 64 20 70 4c 69 73 74      append pList
60f0: 20 22 5b 6a 6f 69 6e 20 24 70 61 72 61 6d 73 20   "[join $params 
6100: 2c 5d 2c 22 0d 0a 20 20 20 20 20 20 20 20 20 20  ,],"..          
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
6120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6130: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
6140: 70 4c 69 73 74 20 22 5b 6a 6f 69 6e 20 24 70 4c  pList "[join $pL
6150: 20 2c 5d 2c 22 0d 0a 20 20 20 20 20 20 20 20 20   ,],"..         
6160: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 20 73 65 74 20 6e 4c 5f 70 72 65 76 20 24 6e    set nL_prev $n
6190: 4c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L..             
61a0: 20 20 20 20 20 20 20 73 65 74 20 70 6e 74 5f 70         set pnt_p
61b0: 72 65 76 4c 20 24 70 6e 74 4c 0d 0a 20 20 20 20  revL $pntL..    
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 69 6e 63 72 20 69 64 78 0d 0a 20 20 20 20 20 20  incr idx..      
61e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
6200: 65 6e 64 20 70 4c 69 73 74 20 22 7a 3b 22 0d 0a  end pList "z;"..
6210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6220: 73 65 74 20 63 20 5b 6c 72 61 6e 67 65 20 24 63  set c [lrange $c
6230: 20 65 6e 64 20 65 6e 64 5d 0d 0a 20 20 20 20 20   end end]..     
6240: 20 20 20 20 20 20 20 20 20 20 20 64 69 63 74 20             dict 
6250: 73 65 74 20 64 20 70 72 65 76 5f 63 6f 70 79 5f  set d prev_copy_
6260: 69 6e 66 6f 20 24 69 64 46 20 24 63 0d 0a 20 20  info $idF $c..  
6270: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
6280: 69 66 20 7b 20 24 6e 20 6e 69 20 22 7a 20 5a 22  if { $n ni "z Z"
6290: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
62a0: 20 20 20 20 20 20 69 66 20 7b 20 24 6e 70 6f 69        if { $npoi
62b0: 6e 74 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20 20  nt == 0 } {..   
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 64 69 63 74 20 73 65 74 20 64 20 70 72 65 76   dict set d prev
62e0: 5f 63 6f 70 79 5f 69 6e 66 6f 30 20 24 69 64 46  _copy_info0 $idF
62f0: 20 5b 6c 69 73 74 20 24 6e 20 24 70 5f 70 72 65   [list $n $p_pre
6300: 76 20 24 70 20 24 70 6e 74 5d 0d 0a 20 20 20 20  v $p $pnt]..    
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 73 65 74 20 63 20 22 22 0d 0a 20 20 20 20 20 20  set c ""..      
6330: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
6340: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6350: 20 20 20 20 20 20 20 20 73 65 74 20 63 20 5b 64          set c [d
6360: 69 63 74 5f 67 65 74 64 20 24 64 20 70 72 65 76  ict_getd $d prev
6370: 5f 63 6f 70 79 5f 69 6e 66 6f 20 24 69 64 46 20  _copy_info $idF 
6380: 22 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ""]..           
6390: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
63a0: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
63b0: 63 20 5b 6c 69 73 74 20 24 6e 20 24 70 5f 70 72  c [list $n $p_pr
63c0: 65 76 20 24 70 20 24 70 6e 74 5d 0d 0a 20 20 20  ev $p $pnt]..   
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63               dic
63e0: 74 20 73 65 74 20 64 20 70 72 65 76 5f 63 6f 70  t set d prev_cop
63f0: 79 5f 69 6e 66 6f 20 24 69 64 46 20 24 63 0d 0a  y_info $idF $c..
6400: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
6410: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
6420: 20 20 69 66 20 7b 20 24 70 4c 69 73 74 20 6e 65    if { $pList ne
6430: 20 22 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20   "" } {..       
6440: 20 20 20 20 20 73 65 74 20 63 6f 6e 74 65 6e 74       set content
6450: 20 22 24 70 4c 69 73 74 22 0d 0a 20 20 20 20 20   "$pList"..     
6460: 20 20 20 20 20 20 20 69 66 20 7b 20 5b 64 69 63         if { [dic
6470: 74 20 67 65 74 20 24 63 6f 70 79 5f 69 6e 66 6f  t get $copy_info
6480: 20 73 74 79 6c 65 5f 6e 61 6d 65 5d 20 6e 65 20   style_name] ne 
6490: 22 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  "" } {..        
64a0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63          append c
64b0: 6f 6e 74 65 6e 74 20 22 20 63 6c 61 73 73 3a 5b  ontent " class:[
64c0: 64 69 63 74 20 67 65 74 20 24 63 6f 70 79 5f 69  dict get $copy_i
64d0: 6e 66 6f 20 73 74 79 6c 65 5f 6e 61 6d 65 5d 3b  nfo style_name];
64e0: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  "..            }
64f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
6500: 74 20 6c 69 6e 65 20 22 24 69 64 43 20 6c 69 6e  t line "$idC lin
6510: 65 20 24 63 6f 6e 74 65 6e 74 22 0d 0a 20 20 20  e $content"..   
6520: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 21 5b           if { ![
6530: 64 69 63 74 20 65 78 69 73 74 73 20 24 64 20 69  dict exists $d i
6540: 64 73 20 24 69 64 43 5d 20 7d 20 7b 0d 0a 20 20  ds $idC] } {..  
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
6560: 70 65 6e 64 5f 6c 69 6e 65 20 64 20 24 69 64 43  pend_line d $idC
6570: 20 24 6c 69 6e 65 20 24 63 6f 6e 74 65 6e 74 0d   $line $content.
6580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6590: 20 64 69 63 74 20 73 65 74 20 64 20 69 64 73 20   dict set d ids 
65a0: 24 69 64 43 20 63 6d 64 20 6c 69 6e 65 0d 0a 20  $idC cmd line.. 
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
65c0: 69 63 74 20 73 65 74 20 64 20 6e 65 65 64 73 5f  ict set d needs_
65d0: 72 65 63 61 6c 63 75 6c 61 74 65 20 31 0d 0a 20  recalculate 1.. 
65e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
65f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
6600: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 72 65 70      return [lrep
6610: 6c 61 63 65 20 24 70 6e 74 20 31 20 32 20 7b 2a  lace $pnt 1 2 {*
6620: 7d 24 70 5d 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20  }$p]..}....proc 
6630: 73 76 67 6d 6c 3a 3a 70 72 6f 63 65 73 73 5f 63  svgml::process_c
6640: 75 62 65 20 7b 20 69 64 20 77 68 61 74 20 61 72  ube { id what ar
6650: 67 73 20 7d 20 7b 0d 0a 20 20 20 20 76 61 72 69  gs } {..    vari
6660: 61 62 6c 65 20 64 0d 0a 20 20 20 20 0d 0a 20 20  able d..    ..  
6670: 20 20 6c 61 73 73 69 67 6e 20 5b 64 69 63 74 20    lassign [dict 
6680: 67 65 74 20 24 64 20 69 64 73 20 24 69 64 20 62  get $d ids $id b
6690: 62 6f 78 5d 20 78 30 20 79 30 20 77 20 68 0d 0a  box] x0 y0 w h..
66a0: 20 20 20 20 73 65 74 20 70 6e 74 73 20 5b 64 69      set pnts [di
66b0: 63 74 20 67 65 74 20 24 64 20 69 64 73 20 24 69  ct get $d ids $i
66c0: 64 20 70 6e 74 73 5d 0d 0a 20 20 20 20 0d 0a 20  d pnts]..    .. 
66d0: 20 20 20 73 65 74 20 61 6e 67 6c 65 73 20 5b 67     set angles [g
66e0: 69 76 65 5f 70 72 6f 70 44 20 24 64 20 24 69 64  ive_propD $d $id
66f0: 20 61 6e 67 6c 65 73 20 22 34 35 64 65 67 2c 34   angles "45deg,4
6700: 35 64 65 67 22 5d 0d 0a 20 20 20 20 73 65 74 20  5deg"]..    set 
6710: 61 6e 67 6c 65 73 4c 69 73 74 20 5b 73 70 6c 69  anglesList [spli
6720: 74 20 24 61 6e 67 6c 65 73 20 22 2c 22 5d 0d 0a  t $angles ","]..
6730: 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74      if { [llengt
6740: 68 20 24 61 6e 67 6c 65 73 4c 69 73 74 5d 20 21  h $anglesList] !
6750: 3d 20 32 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  = 2 } {..       
6760: 20 73 65 74 5f 65 72 72 6f 72 20 24 64 20 24 69   set_error $d $i
6770: 64 20 22 70 72 6f 70 65 72 74 69 65 73 20 61 6e  d "properties an
6780: 67 6c 65 73 20 6d 75 73 74 20 62 65 3a 20 61 6e  gles must be: an
6790: 67 6c 65 73 3a 34 35 64 65 67 2c 34 35 64 65 67  gles:45deg,45deg
67a0: 3b 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73  ;"..    }..    s
67b0: 65 74 20 61 6e 67 6c 65 73 4e 20 22 22 0d 0a 20  et anglesN "".. 
67c0: 20 20 20 66 6f 72 65 61 63 68 20 61 20 24 61 6e     foreach a $an
67d0: 67 6c 65 73 4c 69 73 74 20 7b 0d 0a 20 20 20 20  glesList {..    
67e0: 20 20 20 20 69 66 20 7b 20 5b 72 65 67 65 78 70      if { [regexp
67f0: 20 7b 5e 5c 73 2a 28 5b 2d 2b 5c 64 2e 65 5d 2b   {^\s*([-+\d.e]+
6800: 29 5c 73 2a 64 65 67 5c 73 2a 24 7d 20 24 61 20  )\s*deg\s*$} $a 
6810: 7b 7d 20 76 61 6c 75 65 5d 20 7d 20 7b 0d 0a 20  {} value] } {.. 
6820: 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
6830: 6e 64 20 61 6e 67 6c 65 73 4e 20 24 76 61 6c 75  nd anglesN $valu
6840: 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  e..        } els
6850: 65 69 66 20 7b 20 5b 72 65 67 65 78 70 20 7b 5e  eif { [regexp {^
6860: 5c 73 2a 28 5b 2d 2b 5c 64 2e 65 5d 2b 29 5c 73  \s*([-+\d.e]+)\s
6870: 2a 72 61 64 5c 73 2a 24 7d 20 24 61 20 7b 7d 20  *rad\s*$} $a {} 
6880: 76 61 6c 75 65 5d 20 7d 20 7b 0d 0a 20 20 20 20  value] } {..    
6890: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
68a0: 61 6e 67 6c 65 73 4e 20 5b 65 78 70 72 20 7b 24  anglesN [expr {$
68b0: 6d 3a 3a 72 61 64 74 6f 64 65 67 2a 24 76 61 6c  m::radtodeg*$val
68c0: 75 65 7d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  ue}]..        } 
68d0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
68e0: 20 20 20 20 73 65 74 5f 65 72 72 6f 72 20 24 64      set_error $d
68f0: 20 24 69 64 20 22 70 72 6f 70 65 72 74 69 65 73   $id "properties
6900: 20 61 6e 67 6c 65 73 20 6d 75 73 74 20 62 65 3a   angles must be:
6910: 20 61 6e 67 6c 65 73 3a 34 35 64 65 67 2c 34 35   angles:45deg,45
6920: 64 65 67 3b 22 0d 0a 20 20 20 20 20 20 20 20 7d  deg;"..        }
6930: 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 73 65 74  ..    }..    set
6940: 20 71 20 5b 73 76 67 6d 6c 3a 3a 72 6f 74 61 74   q [svgml::rotat
6950: 65 5f 61 6e 67 6c 65 73 20 7b 2a 7d 24 61 6e 67  e_angles {*}$ang
6960: 6c 65 73 4e 5d 0d 0a 20 20 20 20 0d 0a 20 20 20  lesN]..    ..   
6970: 20 73 65 74 20 69 70 6f 73 20 5b 6c 73 65 61 72   set ipos [lsear
6980: 63 68 20 2d 69 6e 64 65 78 20 30 20 24 70 6e 74  ch -index 0 $pnt
6990: 73 20 22 77 69 64 74 68 2d 68 65 69 67 68 74 22  s "width-height"
69a0: 5d 0d 0a 20 20 20 20 73 65 74 20 68 65 69 67 68  ]..    set heigh
69b0: 74 20 22 22 0d 0a 20 20 20 20 69 66 20 7b 20 24  t ""..    if { $
69c0: 69 70 6f 73 20 21 3d 20 2d 31 20 7d 20 7b 0d 0a  ipos != -1 } {..
69d0: 20 20 20 20 20 20 20 20 73 65 74 20 68 65 69 67          set heig
69e0: 68 74 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 73  ht [lindex $pnts
69f0: 20 24 69 70 6f 73 20 33 5d 0d 0a 20 20 20 20 7d   $ipos 3]..    }
6a00: 0d 0a 20 20 20 20 69 66 20 7b 20 24 68 65 69 67  ..    if { $heig
6a10: 68 74 20 65 71 20 22 22 20 7d 20 7b 0d 0a 20 20  ht eq "" } {..  
6a20: 20 20 20 20 20 20 73 65 74 20 68 65 69 67 68 74        set height
6a30: 20 24 77 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20   $w..    }..    
6a40: 0d 0a 20 20 20 20 73 65 74 20 70 6f 69 6e 74 5f  ..    set point_
6a50: 74 6f 5f 61 78 65 73 20 7b 7b 30 20 30 20 30 7d  to_axes {{0 0 0}
6a60: 20 7b 31 20 30 20 30 7d 20 7b 31 20 31 20 30 7d   {1 0 0} {1 1 0}
6a70: 20 7b 30 20 31 20 30 7d 20 7b 30 20 30 20 31 7d   {0 1 0} {0 0 1}
6a80: 20 7b 31 20 30 20 31 7d 20 7b 31 20 31 20 31 7d   {1 0 1} {1 1 1}
6a90: 20 7b 30 20 31 20 31 7d 7d 0d 0a 20 20 20 20 73   {0 1 1}}..    s
6aa0: 65 74 20 66 61 63 65 5f 74 6f 5f 70 6f 69 6e 74  et face_to_point
6ab0: 73 20 7b 7b 30 20 31 20 32 20 33 7d 20 7b 30 20  s {{0 1 2 3} {0 
6ac0: 34 20 35 20 31 7d 20 7b 31 20 32 20 36 20 35 7d  4 5 1} {1 2 6 5}
6ad0: 20 7b 33 20 37 20 36 20 32 7d 20 7b 30 20 33 20   {3 7 6 2} {0 3 
6ae0: 37 20 34 7d 20 7b 34 20 35 20 36 20 37 7d 7d 0d  7 4} {4 5 6 7}}.
6af0: 0a 20 20 20 20 73 65 74 20 61 72 69 73 74 65 5f  .    set ariste_
6b00: 74 6f 5f 70 6f 69 6e 74 73 20 7b 7b 30 20 31 7d  to_points {{0 1}
6b10: 20 7b 31 20 32 7d 20 7b 33 20 32 7d 20 7b 30 20   {1 2} {3 2} {0 
6b20: 33 7d 20 7b 30 20 34 7d 20 7b 31 20 35 7d 20 7b  3} {0 4} {1 5} {
6b30: 32 20 36 7d 20 7b 33 20 37 7d 20 7b 34 20 35 7d  2 6} {3 7} {4 5}
6b40: 20 7b 35 20 36 7d 20 7b 37 20 36 7d 20 7b 34 20   {5 6} {7 6} {4 
6b50: 37 7d 7d 0d 0a 20 20 20 20 73 65 74 20 66 61 63  7}}..    set fac
6b60: 65 5f 74 6f 5f 6e 6f 72 6d 61 6c 20 7b 32 20 31  e_to_normal {2 1
6b70: 20 30 20 31 20 30 20 32 7d 0d 0a 20 20 20 20 73   0 1 0 2}..    s
6b80: 65 74 20 66 61 63 65 5f 74 6f 5f 6e 6f 72 6d 61  et face_to_norma
6b90: 6c 5f 70 72 65 76 5f 6e 65 78 74 20 7b 30 20 30  l_prev_next {0 0
6ba0: 20 31 20 31 20 30 20 31 7d 0d 0a 20 20 20 20 0d   1 1 0 1}..    .
6bb0: 0a 20 20 20 20 73 65 74 20 70 30 20 5b 6c 69 73  .    set p0 [lis
6bc0: 74 20 5b 65 78 70 72 20 7b 24 78 30 2b 30 2e 35  t [expr {$x0+0.5
6bd0: 2a 24 77 7d 5d 20 5b 65 78 70 72 20 7b 24 79 30  *$w}] [expr {$y0
6be0: 2b 30 2e 35 2a 24 68 7d 5d 5d 0d 0a 20 20 20 20  +0.5*$h}]]..    
6bf0: 0d 0a 20 20 20 20 69 66 20 7b 20 24 77 68 61 74  ..    if { $what
6c00: 20 65 71 20 22 66 61 63 65 73 22 20 7d 20 7b 0d   eq "faces" } {.
6c10: 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 64 78  .        set idx
6c20: 5f 66 61 63 65 73 20 5b 6c 69 73 74 20 30 20 31  _faces [list 0 1
6c30: 20 34 20 32 20 33 20 35 5d 0d 0a 20 20 20 20 20   4 2 3 5]..     
6c40: 20 20 20 73 65 74 20 66 61 63 65 73 20 22 22 0d     set faces "".
6c50: 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
6c60: 20 69 64 78 5f 66 61 63 65 20 24 69 64 78 5f 66   idx_face $idx_f
6c70: 61 63 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  aces {..        
6c80: 20 20 20 20 73 65 74 20 66 61 63 65 20 22 24 69      set face "$i
6c90: 64 78 5f 66 61 63 65 22 0d 0a 20 20 20 20 20 20  dx_face"..      
6ca0: 20 20 20 20 20 20 73 65 74 20 63 65 6e 74 65 72        set center
6cb0: 5f 66 61 63 65 20 22 30 20 30 22 0d 0a 20 20 20  _face "0 0"..   
6cc0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 20 73           for { s
6cd0: 65 74 20 69 20 30 20 7d 20 7b 20 24 69 20 3c 20  et i 0 } { $i < 
6ce0: 34 20 7d 20 7b 20 69 6e 63 72 20 69 20 7d 20 7b  4 } { incr i } {
6cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6d00: 20 20 73 65 74 20 69 64 78 5f 70 6f 69 6e 74 20    set idx_point 
6d10: 5b 6c 69 6e 64 65 78 20 24 66 61 63 65 5f 74 6f  [lindex $face_to
6d20: 5f 70 6f 69 6e 74 73 20 24 69 64 78 5f 66 61 63  _points $idx_fac
6d30: 65 20 24 69 5d 0d 0a 20 20 20 20 20 20 20 20 20  e $i]..         
6d40: 20 20 20 20 20 20 20 73 65 74 20 76 4c 20 5b 6c         set vL [l
6d50: 69 6e 64 65 78 20 24 70 6f 69 6e 74 5f 74 6f 5f  index $point_to_
6d60: 61 78 65 73 20 24 69 64 78 5f 70 6f 69 6e 74 5d  axes $idx_point]
6d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6d80: 20 20 73 65 74 20 78 4c 20 5b 65 78 70 72 20 7b    set xL [expr {
6d90: 28 2d 31 2b 32 2a 5b 6c 69 6e 64 65 78 20 24 76  (-1+2*[lindex $v
6da0: 4c 20 30 5d 29 2a 30 2e 35 2a 24 77 7d 5d 0d 0a  L 0])*0.5*$w}]..
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 73 65 74 20 79 4c 20 5b 65 78 70 72 20 7b 28 2d  set yL [expr {(-
6dd0: 31 2b 32 2a 5b 6c 69 6e 64 65 78 20 24 76 4c 20  1+2*[lindex $vL 
6de0: 31 5d 29 2a 30 2e 35 2a 24 68 7d 5d 0d 0a 20 20  1])*0.5*$h}]..  
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
6e00: 74 20 7a 4c 20 5b 65 78 70 72 20 7b 5b 6c 69 6e  t zL [expr {[lin
6e10: 64 65 78 20 24 76 4c 20 32 5d 2a 24 68 65 69 67  dex $vL 2]*$heig
6e20: 68 74 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ht}]..          
6e30: 20 20 20 20 20 20 73 65 74 20 76 20 5b 6d 3a 3a        set v [m::
6e40: 6d 61 74 6d 75 6c 20 5b 6d 3a 3a 74 72 61 6e 73  matmul [m::trans
6e50: 70 6f 73 65 20 5b 6d 3a 3a 71 75 61 74 65 72 6e  pose [m::quatern
6e60: 69 6f 6e 3a 3a 6d 61 74 72 69 78 20 24 71 5d 5d  ion::matrix $q]]
6e70: 20 5b 6c 69 73 74 20 24 78 4c 20 24 79 4c 20 24   [list $xL $yL $
6e80: 7a 4c 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  zL]]..          
6e90: 20 20 20 20 20 20 73 65 74 20 76 20 5b 6c 69 73        set v [lis
6ea0: 74 20 5b 6c 69 6e 64 65 78 20 24 76 20 30 5d 20  t [lindex $v 0] 
6eb0: 5b 65 78 70 72 20 7b 2d 31 2a 5b 6c 69 6e 64 65  [expr {-1*[linde
6ec0: 78 20 24 76 20 31 5d 7d 5d 5d 0d 0a 20 20 20 20  x $v 1]}]]..    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
6ee0: 70 6e 74 20 5b 6d 3a 3a 61 64 64 20 24 70 30 20  pnt [m::add $p0 
6ef0: 24 76 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  $v]..           
6f00: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 66 61 63       lappend fac
6f10: 65 20 24 70 6e 74 0d 0a 20 20 20 20 20 20 20 20  e $pnt..        
6f20: 20 20 20 20 20 20 20 20 73 65 74 20 63 65 6e 74          set cent
6f30: 65 72 5f 66 61 63 65 20 5b 6d 3a 3a 61 78 70 79  er_face [m::axpy
6f40: 20 30 2e 32 35 20 24 70 6e 74 20 24 63 65 6e 74   0.25 $pnt $cent
6f50: 65 72 5f 66 61 63 65 5d 0d 0a 20 20 20 20 20 20  er_face]..      
6f60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
6f70: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 66 61 63       lappend fac
6f80: 65 73 20 24 66 61 63 65 0d 0a 20 20 20 20 20 20  es $face..      
6f90: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
6fa0: 75 72 6e 20 24 66 61 63 65 73 0d 0a 20 20 20 20  urn $faces..    
6fb0: 7d 20 65 6c 73 65 69 66 20 7b 20 24 77 68 61 74  } elseif { $what
6fc0: 20 65 71 20 22 64 72 61 77 5f 6c 61 62 65 6c 73   eq "draw_labels
6fd0: 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  " } {..        s
6fe0: 65 74 20 78 6d 6c 20 22 22 0d 0a 20 20 20 20 20  et xml ""..     
6ff0: 20 20 20 0d 0a 20 20 20 20 20 20 20 20 69 66 20     ..        if 
7000: 7b 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  { [lindex $args 
7010: 30 5d 20 69 6e 20 22 66 61 63 65 20 61 6c 6c 22  0] in "face all"
7020: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
7030: 20 20 66 6f 72 20 7b 20 73 65 74 20 69 64 78 5f    for { set idx_
7040: 66 61 63 65 20 30 20 7d 20 7b 20 24 69 64 78 5f  face 0 } { $idx_
7050: 66 61 63 65 20 3c 20 36 20 7d 20 7b 20 69 6e 63  face < 6 } { inc
7060: 72 20 69 64 78 5f 66 61 63 65 20 7d 20 7b 0d 0a  r idx_face } {..
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 73 65 74 20 63 65 6e 74 65 72 5f 66 61 63 65 20  set center_face 
7090: 22 30 20 30 22 0d 0a 20 20 20 20 20 20 20 20 20  "0 0"..         
70a0: 20 20 20 20 20 20 20 66 6f 72 20 7b 20 73 65 74         for { set
70b0: 20 69 20 30 20 7d 20 7b 20 24 69 20 3c 20 34 20   i 0 } { $i < 4 
70c0: 7d 20 7b 20 69 6e 63 72 20 69 20 7d 20 7b 0d 0a  } { incr i } {..
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 20 20 73 65 74 20 69 64 78 5f 70 6f 69 6e      set idx_poin
70f0: 74 20 5b 6c 69 6e 64 65 78 20 24 66 61 63 65 5f  t [lindex $face_
7100: 74 6f 5f 70 6f 69 6e 74 73 20 24 69 64 78 5f 66  to_points $idx_f
7110: 61 63 65 20 24 69 5d 0d 0a 20 20 20 20 20 20 20  ace $i]..       
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
7130: 20 76 4c 20 5b 6c 69 6e 64 65 78 20 24 70 6f 69   vL [lindex $poi
7140: 6e 74 5f 74 6f 5f 61 78 65 73 20 24 69 64 78 5f  nt_to_axes $idx_
7150: 70 6f 69 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  point]..        
7160: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
7170: 78 4c 20 5b 65 78 70 72 20 7b 28 2d 31 2b 32 2a  xL [expr {(-1+2*
7180: 5b 6c 69 6e 64 65 78 20 24 76 4c 20 30 5d 29 2a  [lindex $vL 0])*
7190: 30 2e 35 2a 24 77 7d 5d 0d 0a 20 20 20 20 20 20  0.5*$w}]..      
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
71b0: 74 20 79 4c 20 5b 65 78 70 72 20 7b 28 2d 31 2b  t yL [expr {(-1+
71c0: 32 2a 5b 6c 69 6e 64 65 78 20 24 76 4c 20 31 5d  2*[lindex $vL 1]
71d0: 29 2a 30 2e 35 2a 24 68 7d 5d 0d 0a 20 20 20 20  )*0.5*$h}]..    
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71f0: 73 65 74 20 7a 4c 20 5b 65 78 70 72 20 7b 5b 6c  set zL [expr {[l
7200: 69 6e 64 65 78 20 24 76 4c 20 32 5d 2a 24 68 65  index $vL 2]*$he
7210: 69 67 68 74 7d 5d 0d 0a 20 20 20 20 20 20 20 20  ight}]..        
7220: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
7230: 76 20 5b 6d 3a 3a 6d 61 74 6d 75 6c 20 5b 6d 3a  v [m::matmul [m:
7240: 3a 74 72 61 6e 73 70 6f 73 65 20 5b 6d 3a 3a 71  :transpose [m::q
7250: 75 61 74 65 72 6e 69 6f 6e 3a 3a 6d 61 74 72 69  uaternion::matri
7260: 78 20 24 71 5d 5d 20 5b 6c 69 73 74 20 24 78 4c  x $q]] [list $xL
7270: 20 24 79 4c 20 24 7a 4c 5d 5d 0d 0a 20 20 20 20   $yL $zL]]..    
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 73 65 74 20 76 20 5b 6c 69 73 74 20 5b 6c 69 6e  set v [list [lin
72a0: 64 65 78 20 24 76 20 30 5d 20 5b 65 78 70 72 20  dex $v 0] [expr 
72b0: 7b 2d 31 2a 5b 6c 69 6e 64 65 78 20 24 76 20 31  {-1*[lindex $v 1
72c0: 5d 7d 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ]}]]..          
72d0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6e            set pn
72e0: 74 20 5b 6d 3a 3a 61 64 64 20 24 70 30 20 24 76  t [m::add $p0 $v
72f0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
7300: 20 20 20 20 20 20 20 73 65 74 20 63 65 6e 74 65         set cente
7310: 72 5f 66 61 63 65 20 5b 6d 3a 3a 61 78 70 79 20  r_face [m::axpy 
7320: 30 2e 32 35 20 24 70 6e 74 20 24 63 65 6e 74 65  0.25 $pnt $cente
7330: 72 5f 66 61 63 65 5d 0d 0a 20 20 20 20 20 20 20  r_face]..       
7340: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7350: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73              lass
7360: 69 67 6e 20 24 63 65 6e 74 65 72 5f 66 61 63 65  ign $center_face
7370: 20 78 20 79 0d 0a 20 20 20 20 20 20 20 20 20 20   x y..          
7380: 20 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c        append xml
7390: 20 5b 66 6f 72 6d 61 74 20 22 3c 74 65 78 74 20   [format "<text 
73a0: 78 3d 27 25 2e 34 67 27 20 79 3d 27 25 2e 33 67  x='%.4g' y='%.3g
73b0: 27 20 73 74 79 6c 65 3d 27 66 69 6c 6c 3a 20 72  ' style='fill: r
73c0: 65 64 3b 27 3e 22 20 24 78 20 24 79 5d 0d 0a 20  ed;'>" $x $y].. 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
73e0: 70 70 65 6e 64 20 78 6d 6c 20 22 5b 65 78 70 72  ppend xml "[expr
73f0: 20 7b 24 69 64 78 5f 66 61 63 65 2b 31 7d 5d 3c   {$idx_face+1}]<
7400: 2f 74 65 78 74 3e 22 0d 0a 20 20 20 20 20 20 20  /text>"..       
7410: 20 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20           ..     
7420: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
7430: 74 79 6c 65 20 22 73 74 72 6f 6b 65 2d 77 69 64  tyle "stroke-wid
7440: 74 68 3a 20 31 2e 30 70 78 3b 20 73 74 72 6f 6b  th: 1.0px; strok
7450: 65 3a 20 62 6c 61 63 6b 3b 66 69 6c 6c 3a 6e 6f  e: black;fill:no
7460: 6e 65 3b 6d 61 72 6b 65 72 2d 65 6e 64 3a 75 72  ne;marker-end:ur
7470: 6c 28 23 54 72 69 61 6e 67 6c 65 4f 75 74 4c 29  l(#TriangleOutL)
7480: 3b 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;"..            
7490: 20 20 20 20 73 65 74 20 73 74 79 6c 65 54 20 22      set styleT "
74a0: 66 6f 6e 74 2d 73 69 7a 65 3a 20 31 38 70 78 3b  font-size: 18px;
74b0: 20 66 69 6c 6c 3a 20 62 6c 61 63 6b 3b 20 66 6f   fill: black; fo
74c0: 6e 74 2d 66 61 6d 69 6c 79 3a 20 73 61 6e 73 2d  nt-family: sans-
74d0: 73 65 72 69 66 3b 22 0d 0a 20 20 20 20 20 20 20  serif;"..       
74e0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6e 74           set pnt
74f0: 20 5b 70 72 6f 63 65 73 73 5f 63 75 62 65 20 24   [process_cube $
7500: 69 64 20 66 61 63 65 20 5b 65 78 70 72 20 7b 24  id face [expr {$
7510: 69 64 78 5f 66 61 63 65 2b 31 7d 5d 20 37 30 20  idx_face+1}] 70 
7520: 35 30 5d 20 0d 0a 20 20 20 20 20 20 20 20 20 20  50] ..          
7530: 20 20 20 20 20 20 73 65 74 20 70 6e 74 20 5b 6d        set pnt [m
7540: 3a 3a 61 64 64 20 24 63 65 6e 74 65 72 5f 66 61  ::add $center_fa
7550: 63 65 20 5b 6d 3a 3a 73 63 61 6c 65 20 35 30 20  ce [m::scale 50 
7560: 5b 6d 3a 3a 75 6e 69 74 4c 65 6e 67 74 68 56 65  [m::unitLengthVe
7570: 63 74 6f 72 20 5b 6d 3a 3a 73 75 62 20 24 70 6e  ctor [m::sub $pn
7580: 74 20 24 63 65 6e 74 65 72 5f 66 61 63 65 5d 5d  t $center_face]]
7590: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
75a0: 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20 22      append xml "
75b0: 3c 70 61 74 68 20 64 3d 27 4d 24 63 65 6e 74 65  <path d='M$cente
75c0: 72 5f 66 61 63 65 20 4c 24 70 6e 74 27 20 73 74  r_face L$pnt' st
75d0: 79 6c 65 3d 27 24 73 74 79 6c 65 27 2f 3e 22 0d  yle='$style'/>".
75e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
75f0: 20 61 70 70 65 6e 64 20 78 6d 6c 20 5b 66 6f 72   append xml [for
7600: 6d 61 74 20 22 3c 74 65 78 74 20 78 3d 27 25 2e  mat "<text x='%.
7610: 33 67 27 20 79 3d 27 25 2e 33 67 27 20 73 74 79  3g' y='%.3g' sty
7620: 6c 65 3d 27 25 73 27 3e 78 27 3c 2f 74 65 78 74  le='%s'>x'</text
7630: 3e 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  >" \..          
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c                [l
7650: 69 6e 64 65 78 20 24 70 6e 74 20 30 5d 20 5b 6c  index $pnt 0] [l
7660: 69 6e 64 65 78 20 24 70 6e 74 20 31 5d 20 24 73  index $pnt 1] $s
7670: 74 79 6c 65 54 5d 0d 0a 20 20 20 20 20 20 20 20  tyleT]..        
7680: 20 20 20 20 20 20 20 20 73 65 74 20 70 6e 74 20          set pnt 
7690: 5b 70 72 6f 63 65 73 73 5f 63 75 62 65 20 24 69  [process_cube $i
76a0: 64 20 66 61 63 65 20 5b 65 78 70 72 20 7b 24 69  d face [expr {$i
76b0: 64 78 5f 66 61 63 65 2b 31 7d 5d 20 35 30 20 37  dx_face+1}] 50 7
76c0: 30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]..            
76d0: 20 20 20 20 73 65 74 20 70 6e 74 20 5b 6d 3a 3a      set pnt [m::
76e0: 61 64 64 20 24 63 65 6e 74 65 72 5f 66 61 63 65  add $center_face
76f0: 20 5b 6d 3a 3a 73 63 61 6c 65 20 35 30 20 5b 6d   [m::scale 50 [m
7700: 3a 3a 75 6e 69 74 4c 65 6e 67 74 68 56 65 63 74  ::unitLengthVect
7710: 6f 72 20 5b 6d 3a 3a 73 75 62 20 24 70 6e 74 20  or [m::sub $pnt 
7720: 24 63 65 6e 74 65 72 5f 66 61 63 65 5d 5d 5d 5d  $center_face]]]]
7730: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7740: 20 20 61 70 70 65 6e 64 20 78 6d 6c 20 22 3c 70    append xml "<p
7750: 61 74 68 20 64 3d 27 4d 24 63 65 6e 74 65 72 5f  ath d='M$center_
7760: 66 61 63 65 20 4c 24 70 6e 74 27 20 73 74 79 6c  face L$pnt' styl
7770: 65 3d 27 24 73 74 79 6c 65 27 2f 3e 22 0d 0a 20  e='$style'/>".. 
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
7790: 70 70 65 6e 64 20 78 6d 6c 20 5b 66 6f 72 6d 61  ppend xml [forma
77a0: 74 20 22 3c 74 65 78 74 20 78 3d 27 25 2e 33 67  t "<text x='%.3g
77b0: 27 20 79 3d 27 25 2e 33 67 27 20 73 74 79 6c 65  ' y='%.3g' style
77c0: 3d 27 25 73 27 3e 79 27 3c 2f 74 65 78 74 3e 22  ='%s'>y'</text>"
77d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69 6e              [lin
77f0: 64 65 78 20 24 70 6e 74 20 30 5d 20 5b 6c 69 6e  dex $pnt 0] [lin
7800: 64 65 78 20 24 70 6e 74 20 31 5d 20 24 73 74 79  dex $pnt 1] $sty
7810: 6c 65 54 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  leT]..          
7820: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
7830: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 69          if { [li
7840: 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20 69 6e  ndex $args 0] in
7850: 20 22 61 72 69 73 74 65 20 61 6c 6c 22 20 7d 20   "ariste all" } 
7860: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  {..            f
7870: 6f 72 20 7b 20 73 65 74 20 69 64 78 5f 61 72 69  or { set idx_ari
7880: 73 74 65 20 30 20 7d 20 7b 20 24 69 64 78 5f 61  ste 0 } { $idx_a
7890: 72 69 73 74 65 20 3c 20 31 32 20 7d 20 7b 20 69  riste < 12 } { i
78a0: 6e 63 72 20 69 64 78 5f 61 72 69 73 74 65 20 7d  ncr idx_ariste }
78b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
78c0: 20 20 20 20 73 65 74 20 63 65 6e 74 65 72 5f 61      set center_a
78d0: 72 69 73 74 65 20 22 30 20 30 22 0d 0a 20 20 20  riste "0 0"..   
78e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
78f0: 20 7b 20 73 65 74 20 69 20 30 20 7d 20 7b 20 24   { set i 0 } { $
7900: 69 20 3c 20 32 20 7d 20 7b 20 69 6e 63 72 20 69  i < 2 } { incr i
7910: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
7920: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 64            set id
7930: 78 5f 70 6f 69 6e 74 20 5b 6c 69 6e 64 65 78 20  x_point [lindex 
7940: 24 61 72 69 73 74 65 5f 74 6f 5f 70 6f 69 6e 74  $ariste_to_point
7950: 73 20 24 69 64 78 5f 61 72 69 73 74 65 20 24 69  s $idx_ariste $i
7960: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
7970: 20 20 20 20 20 20 20 73 65 74 20 76 4c 20 5b 6c         set vL [l
7980: 69 6e 64 65 78 20 24 70 6f 69 6e 74 5f 74 6f 5f  index $point_to_
7990: 61 78 65 73 20 24 69 64 78 5f 70 6f 69 6e 74 5d  axes $idx_point]
79a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
79b0: 20 20 20 20 20 20 73 65 74 20 78 4c 20 5b 65 78        set xL [ex
79c0: 70 72 20 7b 28 2d 31 2b 32 2a 5b 6c 69 6e 64 65  pr {(-1+2*[linde
79d0: 78 20 24 76 4c 20 30 5d 29 2a 30 2e 35 2a 24 77  x $vL 0])*0.5*$w
79e0: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
79f0: 20 20 20 20 20 20 20 20 73 65 74 20 79 4c 20 5b          set yL [
7a00: 65 78 70 72 20 7b 28 2d 31 2b 32 2a 5b 6c 69 6e  expr {(-1+2*[lin
7a10: 64 65 78 20 24 76 4c 20 31 5d 29 2a 30 2e 35 2a  dex $vL 1])*0.5*
7a20: 24 68 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  $h}]..          
7a30: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7a 4c            set zL
7a40: 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20   [expr {[lindex 
7a50: 24 76 4c 20 32 5d 2a 24 68 65 69 67 68 74 7d 5d  $vL 2]*$height}]
7a60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7a70: 20 20 20 20 20 20 73 65 74 20 76 20 5b 6d 3a 3a        set v [m::
7a80: 6d 61 74 6d 75 6c 20 5b 6d 3a 3a 74 72 61 6e 73  matmul [m::trans
7a90: 70 6f 73 65 20 5b 6d 3a 3a 71 75 61 74 65 72 6e  pose [m::quatern
7aa0: 69 6f 6e 3a 3a 6d 61 74 72 69 78 20 24 71 5d 5d  ion::matrix $q]]
7ab0: 20 5b 6c 69 73 74 20 24 78 4c 20 24 79 4c 20 24   [list $xL $yL $
7ac0: 7a 4c 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  zL]]..          
7ad0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 20            set v 
7ae0: 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 76  [list [lindex $v
7af0: 20 30 5d 20 5b 65 78 70 72 20 7b 2d 31 2a 5b 6c   0] [expr {-1*[l
7b00: 69 6e 64 65 78 20 24 76 20 31 5d 7d 5d 5d 0d 0a  index $v 1]}]]..
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 73 65 74 20 70 6e 74 20 5b 6d 3a 3a      set pnt [m::
7b30: 61 64 64 20 24 70 30 20 24 76 5d 0d 0a 20 20 20  add $p0 $v]..   
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 73 65 74 20 63 65 6e 74 65 72 5f 61 72 69 73   set center_aris
7b60: 74 65 20 5b 6d 3a 3a 61 78 70 79 20 30 2e 35 20  te [m::axpy 0.5 
7b70: 24 70 6e 74 20 24 63 65 6e 74 65 72 5f 61 72 69  $pnt $center_ari
7b80: 73 74 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ste]..          
7b90: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
7ba0: 20 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e           lassign
7bb0: 20 24 63 65 6e 74 65 72 5f 61 72 69 73 74 65 20   $center_ariste 
7bc0: 78 20 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x y..           
7bd0: 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20       append xml 
7be0: 5b 66 6f 72 6d 61 74 20 22 3c 74 65 78 74 20 78  [format "<text x
7bf0: 3d 27 25 2e 33 67 27 20 79 3d 27 25 2e 33 67 27  ='%.3g' y='%.3g'
7c00: 20 73 74 79 6c 65 3d 27 66 69 6c 6c 3a 20 62 6c   style='fill: bl
7c10: 75 65 3b 27 3e 22 20 24 78 20 24 79 5d 0d 0a 20  ue;'>" $x $y].. 
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
7c30: 70 70 65 6e 64 20 78 6d 6c 20 22 5b 65 78 70 72  ppend xml "[expr
7c40: 20 7b 24 69 64 78 5f 61 72 69 73 74 65 2b 31 7d   {$idx_ariste+1}
7c50: 5d 3c 2f 74 65 78 74 3e 22 0d 0a 20 20 20 20 20  ]</text>"..     
7c60: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7c70: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 20    }..        if 
7c80: 7b 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  { [lindex $args 
7c90: 30 5d 20 69 6e 20 22 76 65 72 74 65 78 20 61 6c  0] in "vertex al
7ca0: 6c 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  l" } {..        
7cb0: 20 20 20 20 66 6f 72 20 7b 20 73 65 74 20 69 64      for { set id
7cc0: 78 5f 70 6f 69 6e 74 20 30 20 7d 20 7b 20 24 69  x_point 0 } { $i
7cd0: 64 78 5f 70 6f 69 6e 74 20 3c 20 38 20 7d 20 7b  dx_point < 8 } {
7ce0: 20 69 6e 63 72 20 69 64 78 5f 70 6f 69 6e 74 20   incr idx_point 
7cf0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
7d00: 20 20 20 20 20 73 65 74 20 76 4c 20 5b 6c 69 6e       set vL [lin
7d10: 64 65 78 20 24 70 6f 69 6e 74 5f 74 6f 5f 61 78  dex $point_to_ax
7d20: 65 73 20 24 69 64 78 5f 70 6f 69 6e 74 5d 0d 0a  es $idx_point]..
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 73 65 74 20 78 4c 20 5b 65 78 70 72 20 7b 28 2d  set xL [expr {(-
7d50: 31 2b 32 2a 5b 6c 69 6e 64 65 78 20 24 76 4c 20  1+2*[lindex $vL 
7d60: 30 5d 29 2a 30 2e 35 2a 24 77 7d 5d 0d 0a 20 20  0])*0.5*$w}]..  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
7d80: 74 20 79 4c 20 5b 65 78 70 72 20 7b 28 2d 31 2b  t yL [expr {(-1+
7d90: 32 2a 5b 6c 69 6e 64 65 78 20 24 76 4c 20 31 5d  2*[lindex $vL 1]
7da0: 29 2a 30 2e 35 2a 24 68 7d 5d 0d 0a 20 20 20 20  )*0.5*$h}]..    
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
7dc0: 7a 4c 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65  zL [expr {[linde
7dd0: 78 20 24 76 4c 20 32 5d 2a 24 68 65 69 67 68 74  x $vL 2]*$height
7de0: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
7df0: 20 20 20 20 73 65 74 20 76 20 5b 6d 3a 3a 6d 61      set v [m::ma
7e00: 74 6d 75 6c 20 5b 6d 3a 3a 74 72 61 6e 73 70 6f  tmul [m::transpo
7e10: 73 65 20 5b 6d 3a 3a 71 75 61 74 65 72 6e 69 6f  se [m::quaternio
7e20: 6e 3a 3a 6d 61 74 72 69 78 20 24 71 5d 5d 20 5b  n::matrix $q]] [
7e30: 6c 69 73 74 20 24 78 4c 20 24 79 4c 20 24 7a 4c  list $xL $yL $zL
7e40: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]]..            
7e50: 20 20 20 20 73 65 74 20 76 20 5b 6c 69 73 74 20      set v [list 
7e60: 5b 6c 69 6e 64 65 78 20 24 76 20 30 5d 20 5b 65  [lindex $v 0] [e
7e70: 78 70 72 20 7b 2d 31 2a 5b 6c 69 6e 64 65 78 20  xpr {-1*[lindex 
7e80: 24 76 20 31 5d 7d 5d 5d 0d 0a 20 20 20 20 20 20  $v 1]}]]..      
7e90: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6e            set pn
7ea0: 74 20 5b 6d 3a 3a 61 64 64 20 24 70 30 20 24 76  t [m::add $p0 $v
7eb0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
7ec0: 20 20 20 6c 61 73 73 69 67 6e 20 24 70 6e 74 20     lassign $pnt 
7ed0: 78 20 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x y..           
7ee0: 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20       append xml 
7ef0: 5b 66 6f 72 6d 61 74 20 22 3c 74 65 78 74 20 78  [format "<text x
7f00: 3d 27 25 2e 33 67 27 20 79 3d 27 25 2e 33 67 27  ='%.3g' y='%.3g'
7f10: 20 73 74 79 6c 65 3d 27 66 69 6c 6c 3a 20 67 72   style='fill: gr
7f20: 65 65 6e 3b 27 3e 22 20 24 78 20 24 79 5d 0d 0a  een;'>" $x $y]..
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 61 70 70 65 6e 64 20 78 6d 6c 20 22 5b 65 78 70  append xml "[exp
7f50: 72 20 7b 24 69 64 78 5f 70 6f 69 6e 74 2b 31 7d  r {$idx_point+1}
7f60: 5d 3c 2f 74 65 78 74 3e 22 0d 0a 20 20 20 20 20  ]</text>"..     
7f70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7f80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
7f90: 75 72 6e 20 24 78 6d 6c 0d 0a 20 20 20 20 7d 20  urn $xml..    } 
7fa0: 65 6c 73 65 69 66 20 7b 20 24 77 68 61 74 20 65  elseif { $what e
7fb0: 71 20 22 66 61 63 65 22 20 7d 20 7b 0d 0a 20 20  q "face" } {..  
7fc0: 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 61        lassign $a
7fd0: 72 67 73 20 69 64 78 5f 66 61 63 65 20 78 20 79  rgs idx_face x y
7fe0: 20 7a 0d 0a 20 20 20 20 20 20 20 20 69 6e 63 72   z..        incr
7ff0: 20 69 64 78 5f 66 61 63 65 20 2d 31 0d 0a 20 20   idx_face -1..  
8000: 20 20 20 20 20 20 73 65 74 20 78 20 5b 65 78 70        set x [exp
8010: 72 20 7b 24 78 2f 31 30 30 2e 30 7d 5d 0d 0a 20  r {$x/100.0}].. 
8020: 20 20 20 20 20 20 20 73 65 74 20 79 20 5b 65 78         set y [ex
8030: 70 72 20 7b 24 79 2f 31 30 30 2e 30 7d 5d 0d 0a  pr {$y/100.0}]..
8040: 20 20 20 20 20 20 20 20 73 65 74 20 7a 20 5b 65          set z [e
8050: 78 70 72 20 7b 28 24 7a 20 65 71 20 22 22 29 3f  xpr {($z eq "")?
8060: 30 3a 24 7a 2f 31 30 30 2e 30 7d 5d 0d 0a 20 20  0:$z/100.0}]..  
8070: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 30        lappend p0
8080: 20 30 2e 30 0d 0a 20 20 20 20 20 20 20 20 0d 0a   0.0..        ..
8090: 20 20 20 20 20 20 20 20 73 65 74 20 66 61 63 65          set face
80a0: 20 22 22 0d 0a 20 20 20 20 20 20 20 20 66 6f 72   ""..        for
80b0: 20 7b 20 73 65 74 20 69 20 30 20 7d 20 7b 20 24   { set i 0 } { $
80c0: 69 20 3c 20 34 20 7d 20 7b 20 69 6e 63 72 20 69  i < 4 } { incr i
80d0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
80e0: 20 20 73 65 74 20 69 64 78 5f 70 6f 69 6e 74 20    set idx_point 
80f0: 5b 6c 69 6e 64 65 78 20 24 66 61 63 65 5f 74 6f  [lindex $face_to
8100: 5f 70 6f 69 6e 74 73 20 24 69 64 78 5f 66 61 63  _points $idx_fac
8110: 65 20 24 69 5d 0d 0a 20 20 20 20 20 20 20 20 20  e $i]..         
8120: 20 20 20 73 65 74 20 76 4c 20 5b 6c 69 6e 64 65     set vL [linde
8130: 78 20 24 70 6f 69 6e 74 5f 74 6f 5f 61 78 65 73  x $point_to_axes
8140: 20 24 69 64 78 5f 70 6f 69 6e 74 5d 0d 0a 20 20   $idx_point]..  
8150: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 78 4c            set xL
8160: 20 5b 65 78 70 72 20 7b 28 2d 31 2b 32 2a 5b 6c   [expr {(-1+2*[l
8170: 69 6e 64 65 78 20 24 76 4c 20 30 5d 29 2a 30 2e  index $vL 0])*0.
8180: 35 2a 24 77 7d 5d 0d 0a 20 20 20 20 20 20 20 20  5*$w}]..        
8190: 20 20 20 20 73 65 74 20 79 4c 20 5b 65 78 70 72      set yL [expr
81a0: 20 7b 28 2d 31 2b 32 2a 5b 6c 69 6e 64 65 78 20   {(-1+2*[lindex 
81b0: 24 76 4c 20 31 5d 29 2a 30 2e 35 2a 24 68 7d 5d  $vL 1])*0.5*$h}]
81c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
81d0: 74 20 7a 4c 20 5b 65 78 70 72 20 7b 5b 6c 69 6e  t zL [expr {[lin
81e0: 64 65 78 20 24 76 4c 20 32 5d 2a 24 68 65 69 67  dex $vL 2]*$heig
81f0: 68 74 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ht}]..          
8200: 20 20 73 65 74 20 76 20 5b 6d 3a 3a 6d 61 74 6d    set v [m::matm
8210: 75 6c 20 5b 6d 3a 3a 74 72 61 6e 73 70 6f 73 65  ul [m::transpose
8220: 20 5b 6d 3a 3a 71 75 61 74 65 72 6e 69 6f 6e 3a   [m::quaternion:
8230: 3a 6d 61 74 72 69 78 20 24 71 5d 5d 20 5b 6c 69  :matrix $q]] [li
8240: 73 74 20 24 78 4c 20 24 79 4c 20 24 7a 4c 5d 5d  st $xL $yL $zL]]
8250: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
8260: 74 20 76 20 5b 6c 69 73 74 20 5b 6c 69 6e 64 65  t v [list [linde
8270: 78 20 24 76 20 30 5d 20 5b 65 78 70 72 20 7b 2d  x $v 0] [expr {-
8280: 31 2a 5b 6c 69 6e 64 65 78 20 24 76 20 31 5d 7d  1*[lindex $v 1]}
8290: 5d 20 5b 6c 69 6e 64 65 78 20 24 76 20 32 5d 5d  ] [lindex $v 2]]
82a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
82b0: 74 20 70 6e 74 20 5b 6d 3a 3a 61 64 64 20 24 70  t pnt [m::add $p
82c0: 30 20 24 76 5d 0d 0a 20 20 20 20 20 20 20 20 20  0 $v]..         
82d0: 20 20 20 6c 61 70 70 65 6e 64 20 66 61 63 65 20     lappend face 
82e0: 24 70 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d  $pnt..        }.
82f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72  .        set nor
8300: 6d 61 6c 20 5b 6d 3a 3a 76 65 63 74 6f 72 5f 6e  mal [m::vector_n
8310: 6f 72 6d 61 6c 5f 74 72 69 61 6e 67 6c 65 20 7b  ormal_triangle {
8320: 2a 7d 5b 6c 72 61 6e 67 65 20 24 66 61 63 65 20  *}[lrange $face 
8330: 30 20 32 5d 5d 0d 0a 20 20 20 20 20 20 20 20 73  0 2]]..        s
8340: 65 74 20 73 69 67 6e 20 5b 65 78 70 72 20 7b 28  et sign [expr {(
8350: 5b 6c 69 6e 64 65 78 20 24 66 61 63 65 5f 74 6f  [lindex $face_to
8360: 5f 6e 6f 72 6d 61 6c 5f 70 72 65 76 5f 6e 65 78  _normal_prev_nex
8370: 74 20 24 69 64 78 5f 66 61 63 65 5d 3d 3d 31 29  t $idx_face]==1)
8380: 3f 2d 31 3a 31 7d 5d 0d 0a 20 20 20 20 20 20 20  ?-1:1}]..       
8390: 20 73 65 74 20 6e 6f 72 6d 61 6c 20 5b 6d 3a 3a   set normal [m::
83a0: 73 63 61 6c 65 20 5b 65 78 70 72 20 7b 24 73 69  scale [expr {$si
83b0: 67 6e 2a 24 77 7d 5d 20 5b 6d 3a 3a 75 6e 69 74  gn*$w}] [m::unit
83c0: 4c 65 6e 67 74 68 56 65 63 74 6f 72 20 24 6e 6f  LengthVector $no
83d0: 72 6d 61 6c 5d 5d 0d 0a 20 20 20 20 20 20 20 20  rmal]]..        
83e0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 78  ..        set dx
83f0: 20 5b 6d 3a 3a 73 63 61 6c 65 20 24 78 20 5b 6d   [m::scale $x [m
8400: 3a 3a 73 75 62 20 5b 6c 69 6e 64 65 78 20 24 66  ::sub [lindex $f
8410: 61 63 65 20 31 5d 20 5b 6c 69 6e 64 65 78 20 24  ace 1] [lindex $
8420: 66 61 63 65 20 30 5d 5d 5d 0d 0a 20 20 20 20 20  face 0]]]..     
8430: 20 20 20 73 65 74 20 64 79 20 5b 6d 3a 3a 73 63     set dy [m::sc
8440: 61 6c 65 20 24 79 20 5b 6d 3a 3a 73 75 62 20 5b  ale $y [m::sub [
8450: 6c 69 6e 64 65 78 20 24 66 61 63 65 20 33 5d 20  lindex $face 3] 
8460: 5b 6c 69 6e 64 65 78 20 24 66 61 63 65 20 30 5d  [lindex $face 0]
8470: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ]]..        set 
8480: 64 7a 20 5b 6d 3a 3a 73 63 61 6c 65 20 24 7a 20  dz [m::scale $z 
8490: 24 6e 6f 72 6d 61 6c 5d 0d 0a 20 20 20 20 20 20  $normal]..      
84a0: 20 20 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20    ..        set 
84b0: 70 20 5b 6d 3a 3a 61 64 64 20 5b 6c 69 6e 64 65  p [m::add [linde
84c0: 78 20 24 66 61 63 65 20 30 5d 20 5b 6d 3a 3a 61  x $face 0] [m::a
84d0: 64 64 20 24 64 78 20 5b 6d 3a 3a 61 64 64 20 24  dd $dx [m::add $
84e0: 64 79 20 24 64 7a 5d 5d 5d 0d 0a 20 20 20 20 20  dy $dz]]]..     
84f0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 72 61 6e 67     return [lrang
8500: 65 20 24 70 20 30 20 31 5d 0d 0a 20 20 20 20 7d  e $p 0 1]..    }
8510: 20 65 6c 73 65 69 66 20 7b 20 24 77 68 61 74 20   elseif { $what 
8520: 65 71 20 22 76 65 72 74 65 78 22 20 7d 20 7b 0d  eq "vertex" } {.
8530: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
8540: 20 70 30 20 30 2e 30 0d 0a 20 20 20 20 20 20 20   p0 0.0..       
8550: 20 6c 61 73 73 69 67 6e 20 24 61 72 67 73 20 69   lassign $args i
8560: 64 78 5f 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20  dx_point..      
8570: 20 20 69 6e 63 72 20 69 64 78 5f 70 6f 69 6e 74    incr idx_point
8580: 20 2d 31 0d 0a 20 20 20 20 20 20 20 20 73 65 74   -1..        set
8590: 20 76 4c 20 5b 6c 69 6e 64 65 78 20 24 70 6f 69   vL [lindex $poi
85a0: 6e 74 5f 74 6f 5f 61 78 65 73 20 24 69 64 78 5f  nt_to_axes $idx_
85b0: 70 6f 69 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20  point]..        
85c0: 73 65 74 20 78 4c 20 5b 65 78 70 72 20 7b 28 2d  set xL [expr {(-
85d0: 31 2b 32 2a 5b 6c 69 6e 64 65 78 20 24 76 4c 20  1+2*[lindex $vL 
85e0: 30 5d 29 2a 30 2e 35 2a 24 77 7d 5d 0d 0a 20 20  0])*0.5*$w}]..  
85f0: 20 20 20 20 20 20 73 65 74 20 79 4c 20 5b 65 78        set yL [ex
8600: 70 72 20 7b 28 2d 31 2b 32 2a 5b 6c 69 6e 64 65  pr {(-1+2*[linde
8610: 78 20 24 76 4c 20 31 5d 29 2a 30 2e 35 2a 24 68  x $vL 1])*0.5*$h
8620: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  }]..        set 
8630: 7a 4c 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65  zL [expr {[linde
8640: 78 20 24 76 4c 20 32 5d 2a 24 68 65 69 67 68 74  x $vL 2]*$height
8650: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  }]..        set 
8660: 76 20 5b 6d 3a 3a 6d 61 74 6d 75 6c 20 5b 6d 3a  v [m::matmul [m:
8670: 3a 74 72 61 6e 73 70 6f 73 65 20 5b 6d 3a 3a 71  :transpose [m::q
8680: 75 61 74 65 72 6e 69 6f 6e 3a 3a 6d 61 74 72 69  uaternion::matri
8690: 78 20 24 71 5d 5d 20 5b 6c 69 73 74 20 24 78 4c  x $q]] [list $xL
86a0: 20 24 79 4c 20 24 7a 4c 5d 5d 0d 0a 20 20 20 20   $yL $zL]]..    
86b0: 20 20 20 20 73 65 74 20 76 20 5b 6c 69 73 74 20      set v [list 
86c0: 5b 6c 69 6e 64 65 78 20 24 76 20 30 5d 20 5b 65  [lindex $v 0] [e
86d0: 78 70 72 20 7b 2d 31 2a 5b 6c 69 6e 64 65 78 20  xpr {-1*[lindex 
86e0: 24 76 20 31 5d 7d 5d 20 5b 6c 69 6e 64 65 78 20  $v 1]}] [lindex 
86f0: 24 76 20 32 5d 5d 0d 0a 20 20 20 20 20 20 20 20  $v 2]]..        
8700: 73 65 74 20 70 6e 74 20 5b 6d 3a 3a 61 64 64 20  set pnt [m::add 
8710: 24 70 30 20 24 76 5d 0d 0a 20 20 20 20 20 20 20  $p0 $v]..       
8720: 20 72 65 74 75 72 6e 20 5b 6c 72 61 6e 67 65 20   return [lrange 
8730: 24 70 6e 74 20 30 20 31 5d 0d 0a 20 20 20 20 7d  $pnt 0 1]..    }
8740: 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 73 76 67 6d  ..}....proc svgm
8750: 6c 3a 3a 67 65 74 5f 67 65 6f 6d 65 74 72 79 5f  l::get_geometry_
8760: 70 6f 69 6e 74 20 7b 20 69 64 20 76 65 72 74 65  point { id verte
8770: 78 5f 61 72 69 73 74 65 5f 66 61 63 65 20 70 6e  x_ariste_face pn
8780: 74 73 47 20 6e 75 6d 20 61 72 67 73 20 7d 20 7b  tsG num args } {
8790: 0d 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 64  ..    variable d
87a0: 0d 0a 20 20 20 20 0d 0a 20 20 20 20 0d 0a 20 20  ..    ..    ..  
87b0: 20 20 69 66 20 7b 20 5b 64 69 63 74 20 67 65 74    if { [dict get
87c0: 20 24 64 20 69 64 73 20 24 69 64 20 63 6d 64 5d   $d ids $id cmd]
87d0: 20 65 71 20 22 63 75 62 65 22 20 7d 20 7b 0d 0a   eq "cube" } {..
87e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
87f0: 70 72 6f 63 65 73 73 5f 63 75 62 65 20 24 69 64  process_cube $id
8800: 20 24 76 65 72 74 65 78 5f 61 72 69 73 74 65 5f   $vertex_ariste_
8810: 66 61 63 65 20 24 6e 75 6d 20 7b 2a 7d 24 61 72  face $num {*}$ar
8820: 67 73 5d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20  gs]..    } else 
8830: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20  {..        if { 
8840: 24 76 65 72 74 65 78 5f 61 72 69 73 74 65 5f 66  $vertex_ariste_f
8850: 61 63 65 20 65 71 20 22 66 61 63 65 22 20 7d 20  ace eq "face" } 
8860: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
8870: 65 74 5f 65 72 72 6f 72 20 24 64 20 24 69 64 20  et_error $d $id 
8880: 22 66 61 63 65 20 6f 6e 6c 79 20 61 6c 6c 6f 77  "face only allow
8890: 65 64 20 66 6f 72 20 27 63 75 62 65 27 22 0d 0a  ed for 'cube'"..
88a0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
88b0: 20 20 20 69 66 20 7b 20 24 76 65 72 74 65 78 5f     if { $vertex_
88c0: 61 72 69 73 74 65 5f 66 61 63 65 20 65 71 20 22  ariste_face eq "
88d0: 61 72 69 73 74 65 22 20 7d 20 7b 0d 0a 20 20 20  ariste" } {..   
88e0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c           if { [l
88f0: 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20 6e  index $args 0] n
8900: 65 20 22 6e 6f 72 6d 61 6c 22 20 7d 20 7b 0d 0a  e "normal" } {..
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 73 65 74 20 63 6f 6f 72 64 20 5b 65 78 70 72 20  set coord [expr 
8930: 7b 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30  {[lindex $args 0
8940: 5d 2f 31 30 30 2e 30 7d 5d 0d 0a 20 20 20 20 20  ]/100.0}]..     
8950: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8960: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 73 65 74    }..        set
8970: 20 69 64 78 20 31 0d 0a 20 20 20 20 20 20 20 20   idx 1..        
8980: 73 65 74 20 70 6e 74 73 20 5b 64 69 63 74 5f 67  set pnts [dict_g
8990: 65 74 64 20 24 64 20 69 64 73 20 24 69 64 20 70  etd $d ids $id p
89a0: 6e 74 73 20 22 22 5d 0d 0a 20 20 20 20 20 20 20  nts ""]..       
89b0: 20 66 6f 72 20 7b 20 73 65 74 20 69 20 30 20 7d   for { set i 0 }
89c0: 20 7b 20 24 69 20 3c 20 5b 6c 6c 65 6e 67 74 68   { $i < [llength
89d0: 20 24 70 6e 74 73 5d 20 7d 20 7b 20 69 6e 63 72   $pnts] } { incr
89e0: 20 69 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20   i } {..        
89f0: 20 20 20 20 6c 61 73 73 69 67 6e 20 5b 6c 69 6e      lassign [lin
8a00: 64 65 78 20 24 70 6e 74 73 20 24 69 5d 20 74 79  dex $pnts $i] ty
8a10: 70 65 20 78 20 79 0d 0a 20 20 20 20 20 20 20 20  pe x y..        
8a20: 20 20 20 20 69 66 20 7b 20 24 74 79 70 65 20 69      if { $type i
8a30: 6e 20 22 7a 20 5a 20 71 20 51 20 63 20 43 20 43  n "z Z q Q c C C
8a40: 32 22 20 7d 20 7b 20 63 6f 6e 74 69 6e 75 65 20  2" } { continue 
8a50: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  }..            i
8a60: 66 20 7b 20 24 6e 75 6d 20 3d 3d 20 24 69 64 78  f { $num == $idx
8a70: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
8a80: 20 20 20 20 20 20 69 66 20 7b 20 24 76 65 72 74        if { $vert
8a90: 65 78 5f 61 72 69 73 74 65 5f 66 61 63 65 20 65  ex_ariste_face e
8aa0: 71 20 22 76 65 72 74 65 78 22 20 7d 20 7b 0d 0a  q "vertex" } {..
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
8ad0: 20 24 78 20 24 79 5d 0d 0a 20 20 20 20 20 20 20   $x $y]..       
8ae0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
8af0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
8b00: 20 20 20 20 20 20 20 73 65 74 20 69 5f 6e 65 78         set i_nex
8b10: 74 20 24 69 0d 0a 20 20 20 20 20 20 20 20 20 20  t $i..          
8b20: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 20            for { 
8b30: 73 65 74 20 69 5f 74 72 79 20 30 20 7d 20 7b 20  set i_try 0 } { 
8b40: 24 69 5f 74 72 79 20 3c 20 33 20 7d 20 7b 20 69  $i_try < 3 } { i
8b50: 6e 63 72 20 69 5f 74 72 79 20 7d 20 7b 0d 0a 20  ncr i_try } {.. 
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 20 20 20 20 20 20 69 66 20 7b 20 24 69 5f 6e         if { $i_n
8b80: 65 78 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24  ext < [llength $
8b90: 70 6e 74 73 5d 2d 31 20 7d 20 7b 0d 0a 20 20 20  pnts]-1 } {..   
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 20 20 20 20 20 20 20 73 65 74 20 69 5f 6e           set i_n
8bc0: 65 78 74 20 5b 65 78 70 72 20 7b 24 69 5f 6e 65  ext [expr {$i_ne
8bd0: 78 74 2b 31 7d 5d 0d 0a 20 20 20 20 20 20 20 20  xt+1}]..        
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 20 20 20 20 20 20 73 65 74 20 69 5f 6e 65 78 74        set i_next
8c20: 20 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   0..            
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e         if { [lin
8c60: 64 65 78 20 24 70 6e 74 73 20 24 69 5f 6e 65 78  dex $pnts $i_nex
8c70: 74 5d 20 6e 69 20 22 7a 20 5a 22 20 7d 20 7b 0d  t] ni "z Z" } {.
8c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8ca0: 61 6b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak..            
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
8ce0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 73 69 67            lassig
8cf0: 6e 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 73 20  n [lindex $pnts 
8d00: 24 69 5f 6e 65 78 74 5d 20 74 79 70 65 5f 6e 20  $i_next] type_n 
8d10: 78 5f 6e 20 79 5f 6e 0d 0a 20 20 20 20 20 20 20  x_n y_n..       
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
8d30: 7b 20 24 74 79 70 65 5f 6e 20 69 6e 20 22 51 20  { $type_n in "Q 
8d40: 43 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  C" } {..        
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 24 61 72  if { [lindex $ar
8d70: 67 73 20 30 5d 20 65 71 20 22 6e 6f 72 6d 61 6c  gs 0] eq "normal
8d80: 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  " } {..         
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 20 20 73 65 74 5f 65 72 72 6f 72 20 24 64 20     set_error $d 
8db0: 24 69 64 20 22 6e 6f 74 20 69 6d 70 6c 65 6d 65  $id "not impleme
8dc0: 6e 74 65 64 20 61 72 69 73 74 65 2c 6e 2c 6e 6f  nted ariste,n,no
8dd0: 72 6d 61 6c 20 69 6e 20 71 75 61 64 72 61 74 69  rmal in quadrati
8de0: 63 20 6f 72 20 63 75 62 69 63 20 70 61 74 68 22  c or cubic path"
8df0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8e00: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20      ..          
8e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
8e40: 74 20 62 70 6e 74 73 20 5b 6c 69 73 74 20 24 78  t bpnts [list $x
8e50: 20 24 79 20 24 78 5f 6e 20 24 79 5f 6e 5d 0d 0a   $y $x_n $y_n]..
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 74 79          if { $ty
8e80: 70 65 5f 6e 20 69 6e 20 22 43 22 20 7d 20 7b 0d  pe_n in "C" } {.
8e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
8eb0: 73 69 67 6e 20 5b 6c 69 6e 64 65 78 20 24 70 6e  sign [lindex $pn
8ec0: 74 73 20 24 69 5f 6e 65 78 74 5d 20 74 79 70 65  ts $i_next] type
8ed0: 5f 6e 20 78 5f 6e 20 79 5f 6e 20 7a 5f 6e 20 78  _n x_n y_n z_n x
8ee0: 43 20 79 43 20 7a 43 0d 0a 20 20 20 20 20 20 20  C yC zC..       
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 62 70 6e       lappend bpn
8f10: 74 73 20 24 78 43 20 24 79 43 0d 0a 20 20 20 20  ts $xC $yC..    
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8f50: 65 74 20 69 5f 6e 65 78 74 32 20 24 69 5f 6e 65  et i_next2 $i_ne
8f60: 78 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt..            
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
8f80: 7b 20 73 65 74 20 69 5f 74 72 79 20 30 20 7d 20  { set i_try 0 } 
8f90: 7b 20 24 69 5f 74 72 79 20 3c 20 33 20 7d 20 7b  { $i_try < 3 } {
8fa0: 20 69 6e 63 72 20 69 5f 74 72 79 20 7d 20 7b 0d   incr i_try } {.
8fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
8fd0: 7b 20 24 69 5f 6e 65 78 74 32 20 3c 20 5b 6c 6c  { $i_next2 < [ll
8fe0: 65 6e 67 74 68 20 24 70 6e 74 73 5d 2d 31 20 7d  ength $pnts]-1 }
8ff0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 20 20 73 65 74 20 69 5f 6e 65 78 74 32 20      set i_next2 
9020: 5b 65 78 70 72 20 7b 24 69 5f 6e 65 78 74 32 2b  [expr {$i_next2+
9030: 31 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  1}]..           
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9050: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
9080: 5f 6e 65 78 74 32 20 30 0d 0a 20 20 20 20 20 20  _next2 0..      
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65       if { [linde
90d0: 78 20 24 70 6e 74 73 20 24 69 5f 6e 65 78 74 32  x $pnts $i_next2
90e0: 5d 20 6e 69 20 22 7a 20 5a 22 20 7d 20 7b 0d 0a  ] ni "z Z" } {..
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 20  break..         
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
9150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9160: 20 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e           lassign
9170: 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 73 20 24   [lindex $pnts $
9180: 69 5f 6e 65 78 74 32 5d 20 74 79 70 65 5f 6e 32  i_next2] type_n2
9190: 20 78 5f 6e 32 20 79 5f 6e 32 0d 0a 20 20 20 20   x_n2 y_n2..    
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 69 66 20 7b 20 24 74 79 70 65 5f 6e      if { $type_n
91c0: 32 20 6e 65 20 22 70 6f 69 6e 74 22 20 7d 20 7b  2 ne "point" } {
91d0: 20 65 72 72 6f 72 20 22 61 61 20 24 74 79 70 65   error "aa $type
91e0: 5f 6e 32 22 20 7d 0d 0a 20 20 20 20 20 20 20 20  _n2" }..        
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 6c 61 70 70 65 6e 64 20 62 70 6e 74 73 20 24 78  lappend bpnts $x
9210: 5f 6e 32 20 24 79 5f 6e 32 0d 0a 20 20 20 20 20  _n2 $y_n2..     
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 69 66 20 7b 20 24 74 79 70 65 5f 6e 20     if { $type_n 
9240: 69 6e 20 22 51 22 20 7d 20 7b 0d 0a 20 20 20 20  in "Q" } {..    
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 20 20 73 65 74 20 70 6e 74 20          set pnt 
9270: 5b 6d 3a 3a 65 76 61 6c 5f 71 75 61 64 72 61 74  [m::eval_quadrat
9280: 69 63 5f 62 65 7a 69 65 72 20 7b 2a 7d 24 62 70  ic_bezier {*}$bp
9290: 6e 74 73 20 24 63 6f 6f 72 64 5d 0d 0a 20 20 20  nts $coord]..   
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92b0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
92e0: 6e 74 20 5b 6d 3a 3a 65 76 61 6c 5f 63 75 62 69  nt [m::eval_cubi
92f0: 63 5f 62 65 7a 69 65 72 20 7b 2a 7d 24 62 70 6e  c_bezier {*}$bpn
9300: 74 73 20 24 63 6f 6f 72 64 5d 20 0d 0a 20 20 20  ts $coord] ..   
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9330: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
9340: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
9360: 20 7b 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73   { [lindex $args
9370: 20 30 5d 20 65 71 20 22 6e 6f 72 6d 61 6c 22 20   0] eq "normal" 
9380: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 6c 61 73 73 69 67 6e 20 5b 6c 69 6e 64 65 78   lassign [lindex
93b0: 20 24 70 6e 74 73 47 20 65 6e 64 5d 20 74 79 70   $pntsG end] typ
93c0: 65 50 20 78 50 20 79 50 0d 0a 20 20 20 20 20 20  eP xP yP..      
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93e0: 20 20 20 20 20 20 73 65 74 20 76 20 5b 6d 3a 3a        set v [m::
93f0: 73 75 62 20 22 24 78 20 24 79 22 20 22 24 78 50  sub "$x $y" "$xP
9400: 20 24 79 50 22 5d 0d 0a 20 20 20 20 20 20 20 20   $yP"]..        
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 20 20 73 65 74 20 74 20 5b 6d 3a 3a 73 75      set t [m::su
9430: 62 20 22 24 78 5f 6e 20 24 79 5f 6e 22 20 22 24  b "$x_n $y_n" "$
9440: 78 20 24 79 22 5d 0d 0a 20 20 20 20 20 20 20 20  x $y"]..        
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 20 20 20 20 73 65 74 20 6e 20 5b 6c 69 73 74 20      set n [list 
9470: 5b 65 78 70 72 20 7b 2d 31 2a 5b 6c 69 6e 64 65  [expr {-1*[linde
9480: 78 20 24 74 20 31 5d 7d 5d 20 5b 6c 69 6e 64 65  x $t 1]}] [linde
9490: 78 20 24 74 20 30 5d 5d 0d 0a 20 20 20 20 20 20  x $t 0]]..      
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 20 20 73 65 74 20 6e 30 20 5b 6d 3a        set n0 [m:
94c0: 3a 75 6e 69 74 4c 65 6e 67 74 68 56 65 63 74 6f  :unitLengthVecto
94d0: 72 20 24 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r $n]..         
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 73 65 74 20 64 6f 74 20 5b 6d 3a 3a 64     set dot [m::d
9500: 6f 74 70 72 6f 64 75 63 74 20 24 76 20 24 6e 30  otproduct $v $n0
9510: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9530: 65 74 20 70 6e 74 20 5b 6d 3a 3a 61 78 70 79 20  et pnt [m::axpy 
9540: 24 64 6f 74 20 24 6e 30 20 22 24 78 50 20 24 79  $dot $n0 "$xP $y
9550: 50 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  P"]..           
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
9570: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 73 65 74 20 70 6e 74 20 5b 6d 3a 3a 65     set pnt [m::e
95a0: 76 61 6c 5f 6c 69 6e 65 61 72 20 24 78 20 24 79  val_linear $x $y
95b0: 20 24 78 5f 6e 20 24 79 5f 6e 20 24 63 6f 6f 72   $x_n $y_n $coor
95c0: 64 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d]..            
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
9600: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b            if { [
9610: 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3e  llength $args] >
9620: 20 31 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20   1 } {..        
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 73 65 74 20 74 20 5b 6d 3a 3a 73 75 62 20 22 24  set t [m::sub "$
9650: 78 5f 6e 20 24 79 5f 6e 22 20 22 24 78 20 24 79  x_n $y_n" "$x $y
9660: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
9670: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
9680: 6e 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 7b 2d  n [list [expr {-
9690: 31 2a 5b 6c 69 6e 64 65 78 20 24 74 20 31 5d 7d  1*[lindex $t 1]}
96a0: 5d 20 5b 6c 69 6e 64 65 78 20 24 74 20 30 5d 5d  ] [lindex $t 0]]
96b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
96c0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
96d0: 6f 72 64 59 20 5b 65 78 70 72 20 7b 5b 6c 69 6e  ordY [expr {[lin
96e0: 64 65 78 20 24 61 72 67 73 20 31 5d 2f 31 30 30  dex $args 1]/100
96f0: 2e 30 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  .0}]..          
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
9710: 74 20 70 6e 74 20 5b 6d 3a 3a 61 78 70 79 20 24  t pnt [m::axpy $
9720: 63 6f 6f 72 64 59 20 24 6e 20 24 70 6e 74 5d 0d  coordY $n $pnt].
9730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9740: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9750: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
9760: 72 6e 20 24 70 6e 74 0d 0a 20 20 20 20 20 20 20  rn $pnt..       
9770: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9780: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
9790: 20 20 20 20 20 20 20 69 6e 63 72 20 69 64 78 0d         incr idx.
97a0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
97b0: 7d 0d 0a 20 20 20 20 69 66 20 7b 20 24 6e 75 6d  }..    if { $num
97c0: 20 3c 3d 20 30 20 7c 7c 20 24 6e 75 6d 20 3e 20   <= 0 || $num > 
97d0: 5b 6c 6c 65 6e 67 74 68 20 24 70 6e 74 73 5d 20  [llength $pnts] 
97e0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  } {..        set
97f0: 5f 65 72 72 6f 72 20 24 64 20 24 69 64 20 22 69  _error $d $id "i
9800: 6e 63 6f 72 72 65 63 74 20 70 6f 69 6e 74 20 6e  ncorrect point n
9810: 75 6d 20 6d 75 73 74 20 62 65 20 3e 30 20 3c 6e  um must be >0 <n
9820: 70 6f 69 6e 74 73 22 0d 0a 20 20 20 20 20 20 20  points"..       
9830: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 7d 0d 0a   return..    }..
9840: 20 20 20 20 73 65 74 5f 65 72 72 6f 72 20 24 64      set_error $d
9850: 20 24 69 64 20 22 69 6e 63 6f 72 72 65 63 74 20   $id "incorrect 
9860: 70 6f 69 6e 74 22 0d 0a 7d 0d 0a 0d 0a 70 72 6f  point"..}....pro
9870: 63 20 73 76 67 6d 6c 3a 3a 74 72 61 6e 73 66 6f  c svgml::transfo
9880: 72 6d 20 7b 20 70 6e 74 20 74 79 70 65 20 62 62  rm { pnt type bb
9890: 6f 78 50 78 20 62 62 6f 78 50 79 20 62 62 6f 78  oxPx bboxPy bbox
98a0: 50 7a 20 7d 20 7b 0d 0a 20 20 20 20 0d 0a 20 20  Pz } {..    ..  
98b0: 20 20 6c 61 73 73 69 67 6e 20 24 70 6e 74 20 78    lassign $pnt x
98c0: 20 79 20 7a 0d 0a 20 20 20 20 0d 0a 20 20 20 20   y z..    ..    
98d0: 69 66 20 7b 20 24 74 79 70 65 20 69 6e 20 22 70  if { $type in "p
98e0: 6f 69 6e 74 20 4d 20 4c 20 43 20 51 20 41 22 20  oint M L C Q A" 
98f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  } {..        set
9900: 20 78 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65   x [expr {[linde
9910: 78 20 24 62 62 6f 78 50 78 20 30 5d 2b 24 78 2f  x $bboxPx 0]+$x/
9920: 31 30 30 2e 30 2a 5b 6c 69 6e 64 65 78 20 24 62  100.0*[lindex $b
9930: 62 6f 78 50 78 20 32 5d 7d 5d 0d 0a 20 20 20 20  boxPx 2]}]..    
9940: 20 20 20 20 73 65 74 20 79 20 5b 65 78 70 72 20      set y [expr 
9950: 7b 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78 50 79  {[lindex $bboxPy
9960: 20 31 5d 2b 24 79 2f 31 30 30 2e 30 2a 5b 6c 69   1]+$y/100.0*[li
9970: 6e 64 65 78 20 24 62 62 6f 78 50 79 20 33 5d 7d  ndex $bboxPy 3]}
9980: 5d 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20  ]..        if { 
9990: 24 7a 20 6e 65 20 22 22 20 7d 20 7b 0d 0a 20 20  $z ne "" } {..  
99a0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7a 20            set z 
99b0: 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20 24  [expr {[lindex $
99c0: 62 62 6f 78 50 7a 20 30 5d 2b 24 7a 2f 31 30 30  bboxPz 0]+$z/100
99d0: 2e 30 2a 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78  .0*[lindex $bbox
99e0: 50 7a 20 32 5d 7d 5d 0d 0a 20 20 20 20 20 20 20  Pz 2]}]..       
99f0: 20 7d 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b   }..    } else {
9a00: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 78 20  ..        set x 
9a10: 5b 65 78 70 72 20 7b 24 78 2f 31 30 30 2e 30 2a  [expr {$x/100.0*
9a20: 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78 50 78 20  [lindex $bboxPx 
9a30: 32 5d 7d 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  2]}]..        se
9a40: 74 20 79 20 5b 65 78 70 72 20 7b 24 79 2f 31 30  t y [expr {$y/10
9a50: 30 2e 30 2a 5b 6c 69 6e 64 65 78 20 24 62 62 6f  0.0*[lindex $bbo
9a60: 78 50 79 20 33 5d 7d 5d 0d 0a 20 20 20 20 20 20  xPy 3]}]..      
9a70: 20 20 69 66 20 7b 20 24 7a 20 6e 65 20 22 22 20    if { $z ne "" 
9a80: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
9a90: 20 73 65 74 20 7a 20 5b 65 78 70 72 20 7b 24 7a   set z [expr {$z
9aa0: 2f 31 30 30 2e 30 2a 5b 6c 69 6e 64 65 78 20 24  /100.0*[lindex $
9ab0: 62 62 6f 78 50 7a 20 32 5d 7d 5d 0d 0a 20 20 20  bboxPz 2]}]..   
9ac0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20       }..    }.. 
9ad0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
9ae0: 24 78 20 24 79 20 24 7a 5d 0d 0a 7d 0d 0a 0d 0a  $x $y $z]..}....
9af0: 70 72 6f 63 20 73 76 67 6d 6c 3a 3a 63 61 6c 63  proc svgml::calc
9b00: 75 6c 61 74 65 5f 70 6f 69 6e 74 73 20 7b 20 69  ulate_points { i
9b10: 64 20 63 6f 70 79 5f 69 6e 66 6f 20 7d 20 7b 0d  d copy_info } {.
9b20: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 64 0d  .    variable d.
9b30: 0a 20 20 20 20 0d 0a 20 20 20 20 73 65 74 20 70  .    ..    set p
9b40: 61 72 65 6e 74 20 5b 63 61 6c 63 75 6c 61 74 65  arent [calculate
9b50: 5f 70 61 72 65 6e 74 20 24 69 64 5d 0d 0a 20 20  _parent $id]..  
9b60: 20 20 0d 0a 20 20 20 20 73 65 74 20 70 6e 74 73    ..    set pnts
9b70: 20 22 22 0d 0a 20 20 20 20 66 6f 72 65 61 63 68   ""..    foreach
9b80: 20 22 6e 20 76 22 20 5b 64 69 63 74 20 67 65 74   "n v" [dict get
9b90: 20 24 64 20 69 64 73 20 24 69 64 20 70 72 6f 70   $d ids $id prop
9ba0: 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  s] {..        if
9bb0: 20 7b 20 24 6e 20 6e 69 20 22 70 6f 69 6e 74 20   { $n ni "point 
9bc0: 64 65 6c 74 61 2d 70 6f 69 6e 74 20 77 69 64 74  delta-point widt
9bd0: 68 2d 68 65 69 67 68 74 22 20 7d 20 7b 20 63 6f  h-height" } { co
9be0: 6e 74 69 6e 75 65 20 7d 0d 0a 20 20 20 20 20 20  ntinue }..      
9bf0: 20 20 23 70 75 74 73 20 22 2d 2d 2d 63 61 6c 63    #puts "---calc
9c00: 75 6c 61 74 65 5f 70 6f 69 6e 74 73 20 24 6e 20  ulate_points $n 
9c10: 2d 2d 2d 20 24 76 22 0d 0a 20 20 20 20 20 20 20  --- $v"..       
9c20: 20 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70   ..        set p
9c30: 61 72 65 6e 74 4c 20 24 70 61 72 65 6e 74 0d 0a  arentL $parent..
9c40: 20 20 20 20 20 20 20 20 73 65 74 20 70 6e 74 20          set pnt 
9c50: 22 22 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ""..        set 
9c60: 6e 4c 20 24 6e 0d 0a 20 20 20 20 20 20 20 20 73  nL $n..        s
9c70: 65 74 20 70 61 72 65 6e 74 73 20 22 22 0d 0a 20  et parents "".. 
9c80: 20 20 20 20 20 20 20 73 65 74 20 63 61 6c 63 75         set calcu
9c90: 6c 61 74 65 5f 74 79 70 65 20 22 22 0d 0a 20 20  late_type ""..  
9ca0: 20 20 20 20 20 20 73 65 74 20 76 4c 69 73 74 20        set vList 
9cb0: 5b 73 70 6c 69 74 20 24 76 20 2c 5d 0d 0a 20 20  [split $v ,]..  
9cc0: 20 20 20 20 20 20 66 6f 72 20 7b 20 73 65 74 20        for { set 
9cd0: 69 20 30 20 7d 20 7b 20 24 69 20 3c 20 5b 6c 6c  i 0 } { $i < [ll
9ce0: 65 6e 67 74 68 20 24 76 4c 69 73 74 5d 20 7d 20  ength $vList] } 
9cf0: 7b 20 69 6e 63 72 20 69 20 7d 20 7b 0d 0a 20 20  { incr i } {..  
9d00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 20            set c 
9d10: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 6c 69  [string trim [li
9d20: 6e 64 65 78 20 24 76 4c 69 73 74 20 24 69 5d 5d  ndex $vList $i]]
9d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
9d40: 20 7b 20 5b 72 65 67 65 78 70 20 7b 5e 23 28 5c   { [regexp {^#(\
9d50: 53 2b 29 24 7d 20 24 63 20 7b 7d 20 69 64 50 5d  S+)$} $c {} idP]
9d60: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
9d70: 20 20 20 20 20 20 73 65 74 20 70 61 72 65 6e 74        set parent
9d80: 4c 20 5b 72 65 73 6f 6c 76 65 5f 69 64 20 24 69  L [resolve_id $i
9d90: 64 50 20 24 69 64 5d 0d 0a 20 20 20 20 20 20 20  dP $id]..       
9da0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20       } elseif { 
9db0: 5b 72 65 67 65 78 70 20 7b 5e 28 5b 2d 2b 5c 64  [regexp {^([-+\d
9dc0: 2e 5d 2b 29 24 7d 20 24 63 20 7b 7d 20 76 61 6c  .]+)$} $c {} val
9dd0: 75 65 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  ue] } {..       
9de0: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
9df0: 20 70 6e 74 20 24 76 61 6c 75 65 0d 0a 20 20 20   pnt $value..   
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
9e10: 70 65 6e 64 20 70 61 72 65 6e 74 73 20 24 70 61  pend parents $pa
9e20: 72 65 6e 74 4c 0d 0a 20 20 20 20 20 20 20 20 20  rentL..         
9e30: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 5b 72     } elseif { [r
9e40: 65 67 65 78 70 20 7b 5e 6e 6f 72 6d 61 6c 24 7d  egexp {^normal$}
9e50: 20 24 63 20 76 61 6c 75 65 5d 20 7d 20 7b 0d 0a   $c value] } {..
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 6c 61 70 70 65 6e 64 20 70 6e 74 20 24 76 61 6c  lappend pnt $val
9e80: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
9e90: 20 20 20 20 6c 61 70 70 65 6e 64 20 70 61 72 65      lappend pare
9ea0: 6e 74 73 20 24 70 61 72 65 6e 74 4c 0d 0a 20 20  nts $parentL..  
9eb0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
9ec0: 69 66 20 7b 20 5b 72 65 67 65 78 70 20 7b 5e 5b  if { [regexp {^[
9ed0: 6d 4d 43 63 71 51 7a 5a 6c 4c 5d 24 7d 20 24 63  mMCcqQzZlL]$} $c
9ee0: 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ] } {..         
9ef0: 20 20 20 20 20 20 20 73 65 74 20 6e 4c 20 24 63         set nL $c
9f00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
9f10: 65 6c 73 65 69 66 20 7b 20 5b 72 65 67 65 78 70  elseif { [regexp
9f20: 20 7b 5e 5b 61 41 5d 24 7d 20 24 63 5d 20 7d 20   {^[aA]$} $c] } 
9f30: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9f40: 20 20 20 73 65 74 20 6e 4c 20 24 63 0d 0a 20 20     set nL $c..  
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
9f60: 74 20 70 61 72 61 6d 65 74 65 72 73 20 5b 6c 72  t parameters [lr
9f70: 61 6e 67 65 20 24 76 4c 69 73 74 20 24 69 2b 31  ange $vList $i+1
9f80: 20 24 69 2b 35 5d 0d 0a 20 20 20 20 20 20 20 20   $i+5]..        
9f90: 20 20 20 20 20 20 20 20 69 6e 63 72 20 69 20 35          incr i 5
9fa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9fb0: 20 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20    continue..    
9fc0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
9fd0: 20 7b 20 5b 72 65 67 65 78 70 20 7b 5e 41 41 24   { [regexp {^AA$
9fe0: 7d 20 24 63 5d 20 7d 20 7b 0d 0a 20 20 20 20 20  } $c] } {..     
9ff0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e             set n
a000: 4c 20 24 63 0d 0a 20 20 20 20 20 20 20 20 20 20  L $c..          
a010: 20 20 20 20 20 20 73 65 74 20 70 61 72 61 6d 65        set parame
a020: 74 65 72 73 20 5b 6c 72 61 6e 67 65 20 24 76 4c  ters [lrange $vL
a030: 69 73 74 20 24 69 2b 31 20 24 69 2b 31 5d 0d 0a  ist $i+1 $i+1]..
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 69 6e 63 72 20 69 20 31 0d 0a 20 20 20 20 20 20  incr i 1..      
a060: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
a070: 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
a080: 7d 20 65 6c 73 65 69 66 20 7b 20 5b 72 65 67 65  } elseif { [rege
a090: 78 70 20 7b 76 65 72 74 65 78 7c 61 72 69 73 74  xp {vertex|arist
a0a0: 65 7c 66 61 63 65 7d 20 24 63 5d 20 7d 20 7b 0d  e|face} $c] } {.
a0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a0c0: 20 73 65 74 20 63 61 6c 63 75 6c 61 74 65 5f 74   set calculate_t
a0d0: 79 70 65 20 24 63 0d 0a 20 20 20 20 20 20 20 20  ype $c..        
a0e0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
a100: 74 5f 65 72 72 6f 72 20 24 64 20 24 69 64 20 22  t_error $d $id "
a110: 69 6e 63 6f 72 72 65 63 74 20 66 6f 72 6d 61 74  incorrect format
a120: 20 27 24 6e 3a 24 76 27 22 0d 0a 20 20 20 20 20   '$n:$v'"..     
a130: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a140: 20 20 20 20 20 20 69 66 20 7b 20 24 6e 4c 20 69        if { $nL i
a150: 6e 20 22 7a 20 5a 22 20 7d 20 7b 0d 0a 20 20 20  n "z Z" } {..   
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
a170: 70 65 6e 64 20 70 6e 74 73 20 5b 6c 69 73 74 20  pend pnts [list 
a180: 7a 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  z]..            
a190: 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 73      if { [dict s
a1a0: 69 7a 65 20 24 63 6f 70 79 5f 69 6e 66 6f 5d 20  ize $copy_info] 
a1b0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
a1c0: 20 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e           lassign
a1d0: 20 5b 63 6f 70 79 5f 6f 70 65 72 61 74 69 6f 6e   [copy_operation
a1e0: 20 24 69 64 20 5b 6c 69 73 74 20 24 6e 4c 20 22   $id [list $nL "
a1f0: 22 20 22 22 5d 20 5b 6c 6c 65 6e 67 74 68 20 24  " ""] [llength $
a200: 70 6e 74 73 5d 20 24 63 6f 70 79 5f 69 6e 66 6f  pnts] $copy_info
a210: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
a220: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
a230: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 20 0d        continue .
a240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
a250: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
a260: 20 24 63 61 6c 63 75 6c 61 74 65 5f 74 79 70 65   $calculate_type
a270: 20 65 71 20 22 76 65 72 74 65 78 22 20 7d 20 7b   eq "vertex" } {
a280: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a290: 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20    if { [llength 
a2a0: 24 70 6e 74 5d 20 3c 20 31 20 7d 20 7b 0d 0a 20  $pnt] < 1 } {.. 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20     continue..   
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
a2f0: 73 65 69 66 20 7b 20 24 63 61 6c 63 75 6c 61 74  seif { $calculat
a300: 65 5f 74 79 70 65 20 65 71 20 22 61 72 69 73 74  e_type eq "arist
a310: 65 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  e" } {..        
a320: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 6c          if { [ll
a330: 65 6e 67 74 68 20 24 70 6e 74 5d 20 3c 20 32 20  ength $pnt] < 2 
a340: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
a350: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
a360: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
a370: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
a380: 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e        if { [llen
a390: 67 74 68 20 24 70 6e 74 5d 20 3d 3d 20 32 20 26  gth $pnt] == 2 &
a3a0: 26 20 24 69 20 3d 3d 20 5b 6c 6c 65 6e 67 74 68  & $i == [llength
a3b0: 20 24 76 4c 69 73 74 5d 2d 32 20 26 26 20 0d 0a   $vList]-2 && ..
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 20 5b 69 73 5f 6e 75 6d 62 65 72 20 5b      [is_number [
a3e0: 6c 69 6e 64 65 78 20 24 76 4c 69 73 74 20 24 69  lindex $vList $i
a3f0: 2b 31 5d 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  +1]] } {..      
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
a410: 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20  ntinue..        
a420: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
a430: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
a440: 7b 20 24 63 61 6c 63 75 6c 61 74 65 5f 74 79 70  { $calculate_typ
a450: 65 20 65 71 20 22 66 61 63 65 22 20 7d 20 7b 0d  e eq "face" } {.
a460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a470: 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24   if { [llength $
a480: 70 6e 74 5d 20 3c 20 33 20 7d 20 7b 0d 0a 20 20  pnt] < 3 } {..  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20    continue..    
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
a4d0: 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 70 6e  f { [llength $pn
a4e0: 74 5d 20 3d 3d 20 33 20 26 26 20 24 69 20 3d 3d  t] == 3 && $i ==
a4f0: 20 5b 6c 6c 65 6e 67 74 68 20 24 76 4c 69 73 74   [llength $vList
a500: 5d 2d 32 20 26 26 20 0d 0a 20 20 20 20 20 20 20  ]-2 && ..       
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 73               [is
a520: 5f 6e 75 6d 62 65 72 20 5b 6c 69 6e 64 65 78 20  _number [lindex 
a530: 24 76 4c 69 73 74 20 24 69 2b 31 5d 5d 20 7d 20  $vList $i+1]] } 
a540: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a550: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0d         continue.
a560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a570: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
a580: 7d 20 65 6c 73 65 69 66 20 7b 20 24 6e 4c 20 65  } elseif { $nL e
a590: 71 20 22 77 69 64 74 68 2d 68 65 69 67 68 74 22  q "width-height"
a5a0: 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 76 4c   && [llength $vL
a5b0: 69 73 74 5d 20 3d 3d 20 33 20 26 26 20 5c 0d 0a  ist] == 3 && \..
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 5b 6c 6c 65 6e 67 74 68 20 24 70 6e 74 5d 20 3c  [llength $pnt] <
a5e0: 20 33 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20   3 } {..        
a5f0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
a600: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
a610: 65 6c 73 65 69 66 20 7b 20 5b 6c 6c 65 6e 67 74  elseif { [llengt
a620: 68 20 24 70 6e 74 5d 20 3c 20 32 20 7d 20 7b 0d  h $pnt] < 2 } {.
a630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a640: 20 63 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20   continue..     
a650: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a660: 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 70        lassign $p
a670: 6e 74 20 78 20 79 20 7a 0d 0a 20 20 20 20 20 20  nt x y z..      
a680: 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20        ..        
a690: 20 20 20 20 69 66 20 7b 20 24 63 61 6c 63 75 6c      if { $calcul
a6a0: 61 74 65 5f 74 79 70 65 20 69 6e 20 22 76 65 72  ate_type in "ver
a6b0: 74 65 78 20 61 72 69 73 74 65 20 66 61 63 65 22  tex ariste face"
a6c0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
a6d0: 20 20 20 20 20 20 69 66 20 7b 20 21 5b 64 69 63        if { ![dic
a6e0: 74 20 65 78 69 73 74 73 20 24 64 20 69 64 73 20  t exists $d ids 
a6f0: 24 70 61 72 65 6e 74 4c 20 62 62 6f 78 5d 20 7d  $parentL bbox] }
a700: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a710: 20 20 20 20 20 20 20 20 69 66 20 7b 20 21 5b 64          if { ![d
a720: 69 63 74 20 65 78 69 73 74 73 20 24 64 20 69 64  ict exists $d id
a730: 73 20 24 70 61 72 65 6e 74 4c 5d 20 7d 20 7b 0d  s $parentL] } {.
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a750: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 22           error "
a760: 65 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 70  error: unknown p
a770: 61 72 65 6e 74 20 69 64 20 23 24 70 61 72 65 6e  arent id #$paren
a780: 74 4c 20 66 6f 72 20 69 64 20 23 24 69 64 22 0d  tL for id #$id".
a790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a7a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
a7c0: 72 6e 20 2d 63 6f 64 65 20 63 6f 6e 74 69 6e 75  rn -code continu
a7d0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
a7e0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
a7f0: 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 5b 67        lassign [g
a800: 65 74 5f 67 65 6f 6d 65 74 72 79 5f 70 6f 69 6e  et_geometry_poin
a810: 74 20 24 70 61 72 65 6e 74 4c 20 24 63 61 6c 63  t $parentL $calc
a820: 75 6c 61 74 65 5f 74 79 70 65 20 24 70 6e 74 73  ulate_type $pnts
a830: 20 7b 2a 7d 24 70 6e 74 5d 20 78 20 79 0d 0a 20   {*}$pnt] x y.. 
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
a850: 65 74 20 63 61 6c 63 75 6c 61 74 65 5f 74 79 70  et calculate_typ
a860: 65 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20  e ""..          
a870: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
a880: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
a890: 61 63 68 20 70 61 72 65 6e 74 4c 20 24 70 61 72  ach parentL $par
a8a0: 65 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ents {..        
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
a8c0: 20 21 5b 64 69 63 74 20 65 78 69 73 74 73 20 24   ![dict exists $
a8d0: 64 20 69 64 73 20 24 70 61 72 65 6e 74 4c 20 62  d ids $parentL b
a8e0: 62 6f 78 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  box] } {..      
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65 78    if { ![dict ex
a910: 69 73 74 73 20 24 64 20 69 64 73 20 24 70 61 72  ists $d ids $par
a920: 65 6e 74 4c 5d 20 7d 20 7b 0d 0a 20 20 20 20 20  entL] } {..     
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a940: 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 65 72         error "er
a950: 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 70 61 72  ror: unknown par
a960: 65 6e 74 20 69 64 20 23 24 70 61 72 65 6e 74 4c  ent id #$parentL
a970: 20 66 6f 72 20 69 64 20 23 24 69 64 22 0d 0a 20   for id #$id".. 
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 63    return -code c
a9c0: 6f 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20  ontinue..       
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
aa00: 20 20 20 73 65 74 20 62 62 6f 78 50 78 20 5b 64     set bboxPx [d
aa10: 69 63 74 20 67 65 74 20 24 64 20 69 64 73 20 5b  ict get $d ids [
aa20: 6c 69 6e 64 65 78 20 24 70 61 72 65 6e 74 73 20  lindex $parents 
aa30: 30 5d 20 62 62 6f 78 5d 0d 0a 20 20 20 20 20 20  0] bbox]..      
aa40: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 62 62            set bb
aa50: 6f 78 50 79 20 5b 64 69 63 74 20 67 65 74 20 24  oxPy [dict get $
aa60: 64 20 69 64 73 20 5b 6c 69 6e 64 65 78 20 24 70  d ids [lindex $p
aa70: 61 72 65 6e 74 73 20 31 5d 20 62 62 6f 78 5d 0d  arents 1] bbox].
aa80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa90: 20 69 66 20 7b 20 24 7a 20 6e 65 20 22 22 20 7d   if { $z ne "" }
aaa0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
aab0: 20 20 20 20 20 20 20 20 73 65 74 20 62 62 6f 78          set bbox
aac0: 50 7a 20 5b 64 69 63 74 20 67 65 74 20 24 64 20  Pz [dict get $d 
aad0: 69 64 73 20 5b 6c 69 6e 64 65 78 20 24 70 61 72  ids [lindex $par
aae0: 65 6e 74 73 20 32 5d 20 62 62 6f 78 5d 0d 0a 20  ents 2] bbox].. 
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
ab00: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
ab20: 20 62 62 6f 78 50 7a 20 22 22 0d 0a 20 20 20 20   bboxPz ""..    
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
ab50: 61 73 73 69 67 6e 20 5b 74 72 61 6e 73 66 6f 72  assign [transfor
ab60: 6d 20 22 24 78 20 24 79 20 24 7a 22 20 24 6e 4c  m "$x $y $z" $nL
ab70: 20 24 62 62 6f 78 50 78 20 24 62 62 6f 78 50 79   $bboxPx $bboxPy
ab80: 20 24 62 62 6f 78 50 7a 5d 20 78 20 79 20 7a 0d   $bboxPz] x y z.
ab90: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
aba0: 20 20 20 69 66 20 7b 20 24 6e 4c 20 69 6e 20 22     if { $nL in "
abb0: 61 20 41 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20  a A" } {..      
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
abd0: 73 73 69 67 6e 20 24 70 61 72 61 6d 65 74 65 72  ssign $parameter
abe0: 73 20 72 78 20 72 79 20 78 2d 61 78 69 73 2d 72  s rx ry x-axis-r
abf0: 6f 74 61 74 69 6f 6e 20 6c 61 72 67 65 2d 61 72  otation large-ar
ac00: 63 2d 66 6c 61 67 20 73 77 65 65 70 2d 66 6c 61  c-flag sweep-fla
ac10: 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g..             
ac20: 20 20 20 20 20 20 20 73 65 74 20 72 78 20 5b 65         set rx [e
ac30: 78 70 72 20 7b 24 72 78 2f 31 30 30 2e 30 2a 5b  xpr {$rx/100.0*[
ac40: 6c 69 6e 64 65 78 20 24 62 62 6f 78 50 78 20 32  lindex $bboxPx 2
ac50: 5d 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]}]..           
ac60: 20 20 20 20 20 20 20 20 20 73 65 74 20 72 79 20           set ry 
ac70: 5b 65 78 70 72 20 7b 24 72 79 2f 31 30 30 2e 30  [expr {$ry/100.0
ac80: 2a 5b 6c 69 6e 64 65 78 20 24 62 62 6f 78 50 78  *[lindex $bboxPx
ac90: 20 33 5d 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20   3]}]..         
aca0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
acb0: 61 72 61 6d 65 74 65 72 73 20 5b 6c 69 73 74 20  arameters [list 
acc0: 24 72 78 20 24 72 79 20 24 7b 78 2d 61 78 69 73  $rx $ry ${x-axis
acd0: 2d 72 6f 74 61 74 69 6f 6e 7d 20 24 7b 6c 61 72  -rotation} ${lar
ace0: 67 65 2d 61 72 63 2d 66 6c 61 67 7d 20 24 7b 73  ge-arc-flag} ${s
acf0: 77 65 65 70 2d 66 6c 61 67 7d 5d 0d 0a 20 20 20  weep-flag}]..   
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
ad10: 6c 73 65 69 66 20 7b 20 24 6e 4c 20 69 6e 20 22  lseif { $nL in "
ad20: 41 41 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  AA" } {..       
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
ad40: 73 69 67 6e 20 24 70 61 72 61 6d 65 74 65 72 73  sign $parameters
ad50: 20 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   r..            
ad60: 20 20 20 20 20 20 20 20 73 65 74 20 72 20 5b 65          set r [e
ad70: 78 70 72 20 7b 24 72 2f 31 30 30 2e 30 2a 5b 6c  xpr {$r/100.0*[l
ad80: 69 6e 64 65 78 20 24 62 62 6f 78 50 78 20 32 5d  index $bboxPx 2]
ad90: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
ada0: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 72 61          set para
adb0: 6d 65 74 65 72 73 20 5b 6c 69 73 74 20 24 72 5d  meters [list $r]
adc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
add0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
ade0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
adf0: 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 24 70 6e  if { [lindex $pn
ae00: 74 73 20 65 6e 64 20 30 5d 20 65 71 20 22 43 22  ts end 0] eq "C"
ae10: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
ae20: 20 20 20 20 20 73 65 74 20 6e 4c 20 43 32 0d 0a       set nL C2..
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
ae40: 73 65 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 24  seif { [lindex $
ae50: 70 6e 74 73 20 65 6e 64 20 30 5d 20 65 71 20 22  pnts end 0] eq "
ae60: 63 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  c" } {..        
ae70: 20 20 20 20 20 20 20 73 65 74 20 6e 4c 20 63 32         set nL c2
ae80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
ae90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20  .            .. 
aea0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
aeb0: 6e 74 20 5b 6c 69 73 74 20 24 6e 4c 20 24 78 20  nt [list $nL $x 
aec0: 24 79 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  $y]..           
aed0: 20 69 66 20 7b 20 24 7a 20 6e 65 20 22 22 20 7d   if { $z ne "" }
aee0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
aef0: 20 20 20 20 6c 61 70 70 65 6e 64 20 70 6e 74 20      lappend pnt 
af00: 24 7a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  $z..            
af10: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  }..            i
af20: 66 20 7b 20 24 6e 4c 20 69 6e 20 22 61 20 41 20  f { $nL in "a A 
af30: 41 41 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  AA" } {..       
af40: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 7a           if { $z
af50: 20 65 71 20 22 22 20 7d 20 7b 0d 0a 20 20 20 20   eq "" } {..    
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 6c 61 70 70 65 6e 64 20 70 6e 74 20 30 0d 0a 20  lappend pnt 0.. 
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
af90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
afa0: 20 20 6c 61 70 70 65 6e 64 20 70 6e 74 20 24 70    lappend pnt $p
afb0: 61 72 61 6d 65 74 65 72 73 0d 0a 20 20 20 20 20  arameters..     
afc0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
afd0: 20 20 20 20 20 20 69 66 20 7b 20 24 6e 4c 20 69        if { $nL i
afe0: 6e 20 22 70 6f 69 6e 74 20 6d 20 4d 20 4c 20 43  n "point m M L C
aff0: 20 43 32 20 51 20 41 20 41 41 22 20 26 26 20 5b   C2 Q A AA" && [
b000: 64 69 63 74 20 73 69 7a 65 20 24 63 6f 70 79 5f  dict size $copy_
b010: 69 6e 66 6f 5d 20 7d 20 7b 0d 0a 20 20 20 20 20  info] } {..     
b020: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
b030: 6e 74 20 5b 63 6f 70 79 5f 6f 70 65 72 61 74 69  nt [copy_operati
b040: 6f 6e 20 24 69 64 20 24 70 6e 74 20 5b 6c 6c 65  on $id $pnt [lle
b050: 6e 67 74 68 20 24 70 6e 74 73 5d 20 24 63 6f 70  ngth $pnts] $cop
b060: 79 5f 69 6e 66 6f 5d 0d 0a 20 20 20 20 20 20 20  y_info]..       
b070: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
b080: 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20      ..          
b090: 20 20 6c 61 70 70 65 6e 64 20 70 6e 74 73 20 24    lappend pnts $
b0a0: 70 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  pnt..           
b0b0: 20 73 65 74 20 70 6e 74 20 22 22 0d 0a 20 20 20   set pnt ""..   
b0c0: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 4c 20           set nL 
b0d0: 24 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  $n..            
b0e0: 73 65 74 20 70 61 72 65 6e 74 4c 20 24 70 61 72  set parentL $par
b0f0: 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ent..           
b100: 20 73 65 74 20 70 61 72 65 6e 74 73 20 22 22 0d   set parents "".
b110: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
b120: 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74      if { [llengt
b130: 68 20 24 70 6e 74 5d 20 3d 3d 20 31 20 7d 20 7b  h $pnt] == 1 } {
b140: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
b150: 74 5f 65 72 72 6f 72 20 24 64 20 24 69 64 20 22  t_error $d $id "
b160: 62 61 64 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  bad number of co
b170: 6d 70 6f 6e 65 6e 74 73 20 27 24 6e 3a 24 76 27  mponents '$n:$v'
b180: 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  "..        }..  
b190: 20 20 7d 0d 0a 20 20 20 20 0d 0a 23 23 23 23 23    }..    ..#####
b1a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b1b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b1c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b1d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b1e0: 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 23 20  ############..# 
b1f0: 20 20 20 63 6f 6e 76 65 72 74 69 6e 67 20 41 41     converting AA
b200: 20 74 6f 20 41 0d 0a 23 23 23 23 23 23 23 23 23   to A..#########
b210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b220: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b230: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b250: 23 23 23 23 23 23 23 23 0d 0a 20 20 20 20 0d 0a  ########..    ..
b260: 20 20 20 20 66 6f 72 20 7b 20 73 65 74 20 69 20      for { set i 
b270: 30 20 7d 20 7b 20 24 69 20 3c 20 5b 6c 6c 65 6e  0 } { $i < [llen
b280: 67 74 68 20 24 70 6e 74 73 5d 20 7d 20 7b 20 69  gth $pnts] } { i
b290: 6e 63 72 20 69 20 7d 20 7b 0d 0a 20 20 20 20 20  ncr i } {..     
b2a0: 20 20 20 6c 61 73 73 69 67 6e 20 5b 6c 69 6e 64     lassign [lind
b2b0: 65 78 20 24 70 6e 74 73 20 24 69 5d 20 74 79 70  ex $pnts $i] typ
b2c0: 65 20 78 20 79 0d 0a 20 20 20 20 20 20 20 20 69  e x y..        i
b2d0: 66 20 7b 20 24 74 79 70 65 20 6e 65 20 22 41 41  f { $type ne "AA
b2e0: 22 20 7d 20 7b 20 63 6f 6e 74 69 6e 75 65 20 7d  " } { continue }
b2f0: 0d 0a 20 20 20 20 20 20 20 20 6c 61 73 73 69 67  ..        lassig
b300: 6e 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 73 20  n [lindex $pnts 
b310: 24 69 5d 20 74 79 70 65 20 78 32 20 79 32 20 7a  $i] type x2 y2 z
b320: 20 70 61 72 61 6d 65 74 65 72 73 0d 0a 20 20 20   parameters..   
b330: 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 70 61       lassign $pa
b340: 72 61 6d 65 74 65 72 73 20 72 0d 0a 20 20 20 20  rameters r..    
b350: 20 20 20 20 6c 61 73 73 69 67 6e 20 5b 6c 69 6e      lassign [lin
b360: 64 65 78 20 24 70 6e 74 73 20 24 69 2d 31 5d 20  dex $pnts $i-1] 
b370: 2d 20 78 31 20 79 31 0d 0a 20 20 20 20 20 20 20  - x1 y1..       
b380: 20 6c 61 73 73 69 67 6e 20 5b 6c 69 6e 64 65 78   lassign [lindex
b390: 20 24 70 6e 74 73 20 24 69 2b 31 5d 20 2d 20 78   $pnts $i+1] - x
b3a0: 33 20 79 33 0d 0a 20 20 20 20 20 20 20 20 73 65  3 y3..        se
b3b0: 74 20 70 31 32 20 5b 6d 3a 3a 73 75 62 20 22 24  t p12 [m::sub "$
b3c0: 78 31 20 24 79 31 22 20 22 24 78 32 20 24 79 32  x1 $y1" "$x2 $y2
b3d0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  "]..        set 
b3e0: 70 33 32 20 5b 6d 3a 3a 73 75 62 20 22 24 78 33  p32 [m::sub "$x3
b3f0: 20 24 79 33 22 20 22 24 78 32 20 24 79 32 22 5d   $y3" "$x2 $y2"]
b400: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f  ..        set no
b410: 72 6d 31 32 20 5b 6d 3a 3a 6e 6f 72 6d 20 24 70  rm12 [m::norm $p
b420: 31 32 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74  12]..        set
b430: 20 6e 6f 72 6d 33 32 20 5b 6d 3a 3a 6e 6f 72 6d   norm32 [m::norm
b440: 20 24 70 33 32 5d 0d 0a 20 20 20 20 20 20 20 20   $p32]..        
b450: 73 65 74 20 61 6e 67 6c 65 20 5b 65 78 70 72 20  set angle [expr 
b460: 7b 61 63 6f 73 28 5b 6d 3a 3a 64 6f 74 70 72 6f  {acos([m::dotpro
b470: 64 75 63 74 20 24 70 31 32 20 24 70 33 32 5d 2f  duct $p12 $p32]/
b480: 28 24 6e 6f 72 6d 31 32 2a 24 6e 6f 72 6d 33 32  ($norm12*$norm32
b490: 29 29 7d 5d 0d 0a 20 20 20 20 20 20 20 20 73 65  ))}]..        se
b4a0: 74 20 4c 20 5b 65 78 70 72 20 7b 24 72 2f 74 61  t L [expr {$r/ta
b4b0: 6e 28 24 61 6e 67 6c 65 2f 32 2e 30 29 7d 5d 0d  n($angle/2.0)}].
b4c0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 6c 70  .        set alp
b4d0: 68 61 20 5b 65 78 70 72 20 7b 24 4c 2f 24 6e 6f  ha [expr {$L/$no
b4e0: 72 6d 31 32 7d 5d 0d 0a 20 20 20 20 20 20 20 20  rm12}]..        
b4f0: 73 65 74 20 70 31 5f 6e 20 5b 6d 3a 3a 61 78 70  set p1_n [m::axp
b500: 79 20 24 61 6c 70 68 61 20 24 70 31 32 20 22 24  y $alpha $p12 "$
b510: 78 32 20 24 79 32 22 5d 0d 0a 20 20 20 20 20 20  x2 $y2"]..      
b520: 20 20 73 65 74 20 61 6c 70 68 61 20 5b 65 78 70    set alpha [exp
b530: 72 20 7b 24 4c 2f 24 6e 6f 72 6d 33 32 7d 5d 0d  r {$L/$norm32}].
b540: 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 32 5f  .        set p2_
b550: 6e 20 5b 6d 3a 3a 61 78 70 79 20 24 61 6c 70 68  n [m::axpy $alph
b560: 61 20 24 70 33 32 20 22 24 78 32 20 24 79 32 22  a $p32 "$x2 $y2"
b570: 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73  ]..        set s
b580: 77 65 65 70 5f 66 6c 61 67 20 30 0d 0a 20 20 20  weep_flag 0..   
b590: 20 20 20 20 20 73 65 74 20 70 31 32 5f 33 44 20       set p12_3D 
b5a0: 5b 6c 69 73 74 20 7b 2a 7d 24 70 31 32 20 30 5d  [list {*}$p12 0]
b5b0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 33  ..        set p3
b5c0: 32 5f 33 44 20 5b 6c 69 73 74 20 7b 2a 7d 24 70  2_3D [list {*}$p
b5d0: 33 32 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 73  32 0]..        s
b5e0: 65 74 20 63 72 6f 73 73 20 5b 6d 3a 3a 63 72 6f  et cross [m::cro
b5f0: 73 73 70 72 6f 64 75 63 74 20 24 70 31 32 5f 33  ssproduct $p12_3
b600: 44 20 24 70 33 32 5f 33 44 5d 0d 0a 20 20 20 20  D $p32_3D]..    
b610: 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65 78      if { [lindex
b620: 20 24 63 72 6f 73 73 20 32 5d 20 3c 20 30 20 7d   $cross 2] < 0 }
b630: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b640: 73 65 74 20 73 77 65 65 70 5f 66 6c 61 67 20 31  set sweep_flag 1
b650: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
b660: 20 20 20 20 20 6c 73 65 74 20 70 6e 74 73 20 24       lset pnts $
b670: 69 20 5b 6c 69 73 74 20 70 6f 69 6e 74 20 7b 2a  i [list point {*
b680: 7d 24 70 31 5f 6e 5d 0d 0a 20 20 20 20 20 20 20  }$p1_n]..       
b690: 20 73 65 74 20 70 6e 74 73 20 5b 6c 69 6e 73 65   set pnts [linse
b6a0: 72 74 20 24 70 6e 74 73 20 24 69 2b 31 20 5b 6c  rt $pnts $i+1 [l
b6b0: 69 73 74 20 41 20 7b 2a 7d 24 70 32 5f 6e 20 30  ist A {*}$p2_n 0
b6c0: 20 5b 6c 69 73 74 20 24 72 20 24 72 20 30 20 30   [list $r $r 0 0
b6d0: 20 24 73 77 65 65 70 5f 66 6c 61 67 5d 5d 5d 0d   $sweep_flag]]].
b6e0: 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0d 0a 23 23  .    }..    ..##
b6f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
b740: 0a 23 20 20 20 20 73 74 6f 72 69 6e 67 20 70 6e  .#    storing pn
b750: 74 73 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23  ts..############
b760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b780: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b790: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b7a0: 23 23 23 23 23 0d 0a 20 20 20 20 0d 0a 20 20 20  #####..    ..   
b7b0: 20 69 66 20 7b 20 5b 64 69 63 74 20 73 69 7a 65   if { [dict size
b7c0: 20 24 63 6f 70 79 5f 69 6e 66 6f 5d 20 3d 3d 20   $copy_info] == 
b7d0: 30 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 64  0 } {..        d
b7e0: 69 63 74 20 73 65 74 20 64 20 69 64 73 20 24 69  ict set d ids $i
b7f0: 64 20 70 6e 74 73 20 24 70 6e 74 73 0d 0a 20 20  d pnts $pnts..  
b800: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b810: 20 20 20 20 73 65 74 20 69 64 43 20 5b 64 69 63      set idC [dic
b820: 74 20 67 65 74 20 24 63 6f 70 79 5f 69 6e 66 6f  t get $copy_info
b830: 20 69 64 5d 0d 0a 20 20 20 20 20 20 20 20 73 65   id]..        se
b840: 74 20 70 6e 74 73 4f 20 5b 64 69 63 74 5f 67 65  t pntsO [dict_ge
b850: 74 64 20 24 69 64 43 20 70 6e 74 73 20 22 22 5d  td $idC pnts ""]
b860: 0d 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e  ..        lappen
b870: 64 20 70 6e 74 73 4f 20 7b 2a 7d 24 70 6e 74 73  d pntsO {*}$pnts
b880: 0d 0a 20 20 20 20 20 20 20 20 64 69 63 74 20 73  ..        dict s
b890: 65 74 20 64 20 69 64 73 20 24 69 64 43 20 70 6e  et d ids $idC pn
b8a0: 74 73 20 24 70 6e 74 73 0d 0a 20 20 20 20 7d 0d  ts $pnts..    }.
b8b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 70 6e 74  .    return $pnt
b8c0: 73 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 73 76 67  s..}....proc svg
b8d0: 6d 6c 3a 3a 67 69 76 65 5f 64 65 73 63 65 6e 64  ml::give_descend
b8e0: 61 6e 74 73 20 7b 20 69 64 20 69 64 5f 61 76 6f  ants { id id_avo
b8f0: 69 64 20 7d 20 7b 0d 0a 20 20 20 20 76 61 72 69  id } {..    vari
b900: 61 62 6c 65 20 64 0d 0a 20 20 20 20 0d 0a 20 20  able d..    ..  
b910: 20 20 73 65 74 20 69 64 73 4c 69 73 74 20 22 22    set idsList ""
b920: 0d 0a 20 20 20 20 73 65 74 20 69 64 4c 20 5b 73  ..    set idL [s
b930: 70 6c 69 74 20 24 69 64 20 22 2e 22 5d 0d 0a 20  plit $id "."].. 
b940: 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b     set n [expr {
b950: 5b 6c 6c 65 6e 67 74 68 20 24 69 64 4c 5d 2d 31  [llength $idL]-1
b960: 7d 5d 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20  }]..    foreach 
b970: 69 64 43 20 5b 64 69 63 74 20 6b 65 79 73 20 5b  idC [dict keys [
b980: 64 69 63 74 20 67 65 74 20 24 64 20 69 64 73 5d  dict get $d ids]
b990: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ] {..        if 
b9a0: 7b 20 24 69 64 43 20 65 71 20 24 69 64 5f 61 76  { $idC eq $id_av
b9b0: 6f 69 64 20 7d 20 7b 20 63 6f 6e 74 69 6e 75 65  oid } { continue
b9c0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   }..        set 
b9d0: 69 64 43 4c 20 5b 73 70 6c 69 74 20 24 69 64 43  idCL [split $idC
b9e0: 20 22 2e 22 5d 0d 0a 20 20 20 20 20 20 20 20 69   "."]..        i
b9f0: 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 69 64  f { [llength $id
ba00: 43 4c 5d 20 3c 3d 20 5b 6c 6c 65 6e 67 74 68 20  CL] <= [llength 
ba10: 24 69 64 4c 5d 20 7d 20 7b 20 63 6f 6e 74 69 6e  $idL] } { contin
ba20: 75 65 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66  ue }..        if
ba30: 20 7b 20 5b 6c 72 61 6e 67 65 20 5b 73 70 6c 69   { [lrange [spli
ba40: 74 20 24 69 64 43 20 22 2e 22 5d 20 30 20 24 6e  t $idC "."] 0 $n
ba50: 5d 20 65 71 20 24 69 64 4c 20 7d 20 7b 0d 0a 20  ] eq $idL } {.. 
ba60: 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
ba70: 6e 64 20 69 64 73 4c 69 73 74 20 24 69 64 43 0d  nd idsList $idC.
ba80: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
ba90: 7d 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 69  }..    return $i
baa0: 64 73 4c 69 73 74 0d 0a 7d 0d 0a 0d 0a 70 72 6f  dsList..}....pro
bab0: 63 20 70 6e 67 73 69 7a 65 5f 64 61 74 61 20 7b  c pngsize_data {
bac0: 20 64 61 74 61 20 7d 20 7b 0d 0a 0d 0a 20 20 20   data } {....   
bad0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
bae0: 67 74 68 20 24 64 61 74 61 5d 20 3c 20 33 33 7d  gth $data] < 33}
baf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 72 72 6f   {..        erro
bb00: 72 20 22 46 69 6c 65 20 6e 6f 74 20 6c 61 72 67  r "File not larg
bb10: 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
bb20: 61 69 6e 20 50 4e 47 20 68 65 61 64 65 72 22 0d  ain PNG header".
bb30: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 23 20  .    }....    # 
bb40: 52 65 61 64 20 50 4e 47 20 66 69 6c 65 20 73 69  Read PNG file si
bb50: 67 6e 61 74 75 72 65 0d 0a 20 20 20 20 62 69 6e  gnature..    bin
bb60: 61 72 79 20 73 63 61 6e 20 5b 73 74 72 69 6e 67  ary scan [string
bb70: 20 72 61 6e 67 65 20 24 64 61 74 61 20 30 20 37   range $data 0 7
bb80: 5d 20 63 38 20 73 69 67 0d 0a 20 20 20 20 66 6f  ] c8 sig..    fo
bb90: 72 65 61 63 68 20 62 31 20 24 73 69 67 20 62 32  reach b1 $sig b2
bba0: 20 7b 2d 31 31 39 20 38 30 20 37 38 20 37 31 20   {-119 80 78 71 
bbb0: 31 33 20 31 30 20 32 36 20 31 30 7d 20 7b 0d 0a  13 10 26 10} {..
bbc0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 62 31 20          if {$b1 
bbd0: 21 3d 20 24 62 32 7d 20 7b 0d 0a 20 20 20 20 20  != $b2} {..     
bbe0: 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 64 61         error "da
bbf0: 74 61 20 69 73 20 6e 6f 74 20 61 20 50 4e 47 20  ta is not a PNG 
bc00: 66 69 6c 65 22 0d 0a 20 20 20 20 20 20 20 20 7d  file"..        }
bc10: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20  ..    }....     
bc20: 23 20 52 65 61 64 20 49 48 44 52 20 63 68 75 6e  # Read IHDR chun
bc30: 6b 20 73 69 67 6e 61 74 75 72 65 0d 0a 20 20 20  k signature..   
bc40: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 5b 73 74   binary scan [st
bc50: 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61  ring range $data
bc60: 20 38 20 31 35 5d 20 63 38 20 73 69 67 0d 0a 20   8 15] c8 sig.. 
bc70: 20 20 20 66 6f 72 65 61 63 68 20 62 31 20 24 73     foreach b1 $s
bc80: 69 67 20 62 32 20 7b 30 20 30 20 30 20 31 33 20  ig b2 {0 0 0 13 
bc90: 37 33 20 37 32 20 36 38 20 38 32 7d 20 7b 0d 0a  73 72 68 82} {..
bca0: 20 20 20 20 20 20 20 20 69 66 20 7b 24 62 31 20          if {$b1 
bcb0: 21 3d 20 24 62 32 7d 20 7b 0d 0a 20 20 20 20 20  != $b2} {..     
bcc0: 20 20 20 20 20 20 20 65 72 72 6f 72 20 22 64 61         error "da
bcd0: 74 61 20 69 73 20 6d 69 73 73 69 6e 67 20 61 20  ta is missing a 
bce0: 6c 65 61 64 69 6e 67 20 49 48 44 52 20 63 68 75  leading IHDR chu
bcf0: 6e 6b 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  nk"..        }..
bd00: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 23       }....     #
bd10: 20 52 65 61 64 20 6f 66 66 20 74 68 65 20 73 69   Read off the si
bd20: 7a 65 20 6f 66 20 74 68 65 20 69 6d 61 67 65 0d  ze of the image.
bd30: 0a 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e  .    binary scan
bd40: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
bd50: 64 61 74 61 20 31 36 20 32 33 5d 20 49 49 20 77  data 16 23] II w
bd60: 69 64 74 68 20 68 65 69 67 68 74 0d 0a 20 20 20  idth height..   
bd70: 20 20 23 20 49 67 6e 6f 72 65 20 74 68 65 20 72    # Ignore the r
bd80: 65 73 74 20 6f 66 20 74 68 65 20 64 61 74 61 2c  est of the data,
bd90: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 63   including the c
bda0: 68 75 6e 6b 20 43 52 43 21 0d 0a 20 20 20 20 20  hunk CRC!..     
bdb0: 23 62 69 6e 61 72 79 20 73 63 61 6e 20 5b 72 65  #binary scan [re
bdc0: 61 64 20 24 66 20 35 5d 20 63 63 63 63 63 20 64  ad $f 5] ccccc d
bdd0: 65 70 74 68 20 74 79 70 65 20 63 6f 6d 70 72 65  epth type compre
bde0: 73 73 69 6f 6e 20 66 69 6c 74 65 72 20 69 6e 74  ssion filter int
bdf0: 65 72 6c 61 63 65 0d 0a 20 20 20 20 20 23 62 69  erlace..     #bi
be00: 6e 61 72 79 20 73 63 61 6e 20 5b 72 65 61 64 20  nary scan [read 
be10: 24 66 20 34 5d 20 49 20 63 68 75 6e 6b 43 52 43  $f 4] I chunkCRC
be20: 0d 0a 0d 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  ....    return [
be30: 6c 69 73 74 20 24 77 69 64 74 68 20 24 68 65 69  list $width $hei
be40: 67 68 74 5d 0d 0a 20 7d 0d 0a 0d 0a 70 72 6f 63  ght].. }....proc
be50: 20 73 76 67 6d 6c 3a 3a 63 72 65 61 74 65 5f 65   svgml::create_e
be60: 6e 74 69 74 79 20 7b 20 69 64 20 63 6f 70 79 5f  ntity { id copy_
be70: 69 6e 66 6f 20 7d 20 7b 0d 0a 20 20 20 20 76 61  info } {..    va
be80: 72 69 61 62 6c 65 20 64 0d 0a 20 20 20 20 76 61  riable d..    va
be90: 72 69 61 62 6c 65 20 78 6d 6c 0d 0a 20 20 20 20  riable xml..    
bea0: 0d 0a 20 20 20 20 73 65 74 20 72 65 74 20 5b 63  ..    set ret [c
beb0: 61 74 63 68 20 7b 20 63 61 6c 63 75 6c 61 74 65  atch { calculate
bec0: 5f 70 6f 69 6e 74 73 20 24 69 64 20 24 63 6f 70  _points $id $cop
bed0: 79 5f 69 6e 66 6f 20 7d 20 70 6e 74 73 20 6f 70  y_info } pnts op
bee0: 74 73 5d 0d 0a 20 20 20 20 69 66 20 7b 20 24 72  ts]..    if { $r
bef0: 65 74 20 21 3d 20 30 20 7d 20 7b 0d 0a 20 20 20  et != 0 } {..   
bf00: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64       return -cod
bf10: 65 20 24 72 65 74 20 2d 65 72 72 6f 72 69 6e 66  e $ret -errorinf
bf20: 6f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o \..           
bf30: 20 5b 64 69 63 74 5f 67 65 74 64 20 24 6f 70 74   [dict_getd $opt
bf40: 73 20 2d 65 72 72 6f 72 69 6e 66 6f 20 22 22 5d  s -errorinfo ""]
bf50: 20 24 70 6e 74 73 0d 0a 20 20 20 20 7d 0d 0a 0d   $pnts..    }...
bf60: 0a 20 20 20 20 6c 61 73 73 69 67 6e 20 5b 67 69  .    lassign [gi
bf70: 76 65 5f 61 6e 63 68 6f 72 5f 61 78 65 73 20 24  ve_anchor_axes $
bf80: 64 20 24 69 64 5d 20 61 6e 63 68 6f 72 58 20 61  d $id] anchorX a
bf90: 6e 63 68 6f 72 59 0d 0a 20 20 20 20 0d 0a 20 20  nchorY..    ..  
bfa0: 20 20 73 65 74 20 70 6e 74 73 42 42 4f 58 20 22    set pntsBBOX "
bfb0: 22 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 70  "..    foreach p
bfc0: 20 24 70 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20   $pnts {..      
bfd0: 20 20 6c 61 73 73 69 67 6e 20 24 70 20 74 79 70    lassign $p typ
bfe0: 65 20 78 20 79 0d 0a 20 20 20 20 20 20 20 20 69  e x y..        i
bff0: 66 20 7b 20 24 74 79 70 65 20 65 71 20 22 77 69  f { $type eq "wi
c000: 64 74 68 2d 68 65 69 67 68 74 22 20 7d 20 7b 0d  dth-height" } {.
c010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73  .            las
c020: 73 69 67 6e 20 24 70 20 2d 20 62 20 68 0d 0a 20  sign $p - b h.. 
c030: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20             if { 
c040: 5b 6c 6c 65 6e 67 74 68 20 24 70 6e 74 73 42 42  [llength $pntsBB
c050: 4f 58 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  OX] } {..       
c060: 20 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e           lassign
c070: 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 73 42 42   [lindex $pntsBB
c080: 4f 58 20 65 6e 64 5d 20 78 20 79 0d 0a 20 20 20  OX end] x y..   
c090: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
c0a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
c0b0: 20 20 20 73 65 74 20 69 70 6f 73 20 5b 6c 73 65     set ipos [lse
c0c0: 61 72 63 68 20 2d 69 6e 64 65 78 20 30 20 24 70  arch -index 0 $p
c0d0: 6e 74 73 20 70 6f 69 6e 74 5d 0d 0a 20 20 20 20  nts point]..    
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
c0f0: 20 24 69 70 6f 73 20 3d 3d 20 2d 31 20 7d 20 7b   $ipos == -1 } {
c100: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c110: 20 20 20 20 20 20 73 65 74 5f 65 72 72 6f 72 20        set_error 
c120: 24 64 20 24 69 64 20 22 70 72 6f 70 65 72 74 79  $d $id "property
c130: 20 27 77 69 64 74 68 2d 68 65 69 67 68 74 27 20   'width-height' 
c140: 6e 65 65 64 73 20 61 20 27 70 6f 69 6e 74 27 22  needs a 'point'"
c150: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c160: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
c170: 20 20 20 20 20 6c 61 73 73 69 67 6e 20 5b 6c 69       lassign [li
c180: 6e 64 65 78 20 24 70 6e 74 73 20 24 69 70 6f 73  ndex $pnts $ipos
c190: 5d 20 2d 20 78 20 79 0d 0a 20 20 20 20 20 20 20  ] - x y..       
c1a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
c1b0: 20 20 20 20 73 65 74 20 61 31 78 20 5b 65 78 70      set a1x [exp
c1c0: 72 20 7b 2d 30 2e 35 2a 28 31 2e 30 2d 24 61 6e  r {-0.5*(1.0-$an
c1d0: 63 68 6f 72 58 29 7d 5d 0d 0a 20 20 20 20 20 20  chorX)}]..      
c1e0: 20 20 20 20 20 20 73 65 74 20 61 32 78 20 5b 65        set a2x [e
c1f0: 78 70 72 20 7b 30 2e 35 2a 28 31 2e 30 2b 24 61  xpr {0.5*(1.0+$a
c200: 6e 63 68 6f 72 58 29 7d 5d 0d 0a 20 20 20 20 20  nchorX)}]..     
c210: 20 20 20 20 20 20 20 73 65 74 20 61 31 79 20 5b         set a1y [
c220: 65 78 70 72 20 7b 2d 30 2e 35 2a 28 31 2e 30 2d  expr {-0.5*(1.0-
c230: 24 61 6e 63 68 6f 72 59 29 7d 5d 0d 0a 20 20 20  $anchorY)}]..   
c240: 20 20 20 20 20 20 20 20 20 73 65 74 20 61 32 79           set a2y
c250: 20 5b 65 78 70 72 20 7b 30 2e 35 2a 28 31 2e 30   [expr {0.5*(1.0
c260: 2b 24 61 6e 63 68 6f 72 59 29 7d 5d 0d 0a 20 20  +$anchorY)}]..  
c270: 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20            ..    
c280: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
c290: 70 6e 74 73 42 42 4f 58 20 5b 6c 69 73 74 20 5b  pntsBBOX [list [
c2a0: 65 78 70 72 20 7b 24 78 2b 24 61 31 78 2a 24 62  expr {$x+$a1x*$b
c2b0: 7d 5d 20 5b 65 78 70 72 20 7b 24 79 2b 24 61 31  }] [expr {$y+$a1
c2c0: 79 2a 24 68 7d 5d 5d 0d 0a 20 20 20 20 20 20 20  y*$h}]]..       
c2d0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 6e 74       lappend pnt
c2e0: 73 42 42 4f 58 20 5b 6c 69 73 74 20 5b 65 78 70  sBBOX [list [exp
c2f0: 72 20 7b 24 78 2b 24 61 32 78 2a 24 62 7d 5d 20  r {$x+$a2x*$b}] 
c300: 5b 65 78 70 72 20 7b 24 79 2b 24 61 32 79 2a 24  [expr {$y+$a2y*$
c310: 68 7d 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  h}]]..        } 
c320: 65 6c 73 65 69 66 20 7b 20 24 74 79 70 65 20 69  elseif { $type i
c330: 6e 20 22 70 6f 69 6e 74 20 4c 20 43 20 51 20 41  n "point L C Q A
c340: 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  " } {..         
c350: 20 20 20 6c 61 70 70 65 6e 64 20 70 6e 74 73 42     lappend pntsB
c360: 42 4f 58 20 5b 6c 69 73 74 20 24 78 20 24 79 5d  BOX [list $x $y]
c370: 0d 0a 20 20 20 20 20 20 20 20 7d 20 20 65 6c 73  ..        }  els
c380: 65 69 66 20 7b 20 24 74 79 70 65 20 69 6e 20 22  eif { $type in "
c390: 64 65 6c 74 61 2d 70 6f 69 6e 74 20 71 20 6c 20  delta-point q l 
c3a0: 63 20 61 22 20 26 26 20 5b 6c 6c 65 6e 67 74 68  c a" && [llength
c3b0: 20 24 70 6e 74 73 42 42 4f 58 5d 20 7d 20 7b 0d   $pntsBBOX] } {.
c3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73  .            las
c3d0: 73 69 67 6e 20 5b 6c 69 6e 64 65 78 20 24 70 6e  sign [lindex $pn
c3e0: 74 73 42 42 4f 58 20 65 6e 64 5d 20 78 70 20 79  tsBBOX end] xp y
c3f0: 70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  p..            s
c400: 65 74 20 78 20 5b 65 78 70 72 20 7b 24 78 2b 24  et x [expr {$x+$
c410: 78 70 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  xp}]..          
c420: 20 20 73 65 74 20 79 20 5b 65 78 70 72 20 7b 24    set y [expr {$
c430: 79 2b 24 79 70 7d 5d 0d 0a 20 20 20 20 20 20 20  y+$yp}]..       
c440: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70 6e 74       lappend pnt
c450: 73 42 42 4f 58 20 5b 6c 69 73 74 20 24 78 20 24  sBBOX [list $x $
c460: 79 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  y]..        }.. 
c470: 20 20 20 7d 0d 0a 20 20 20 20 0d 0a 20 20 20 20     }..    ..    
c480: 6c 61 73 73 69 67 6e 20 22 22 20 78 30 20 79 30  lassign "" x0 y0
c490: 20 78 31 20 79 31 0d 0a 20 20 20 20 69 66 20 7b   x1 y1..    if {
c4a0: 20 5b 6c 6c 65 6e 67 74 68 20 24 70 6e 74 73 42   [llength $pntsB
c4b0: 42 4f 58 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  BOX] } {..      
c4c0: 20 20 66 6f 72 65 61 63 68 20 70 20 24 70 6e 74    foreach p $pnt
c4d0: 73 42 42 4f 58 20 7b 0d 0a 20 20 20 20 20 20 20  sBBOX {..       
c4e0: 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 70 20       lassign $p 
c4f0: 78 20 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x y..           
c500: 20 69 66 20 7b 20 24 78 30 20 65 71 20 22 22 20   if { $x0 eq "" 
c510: 7c 7c 20 24 78 20 3c 20 24 78 30 20 7d 20 7b 20  || $x < $x0 } { 
c520: 73 65 74 20 78 30 20 24 78 20 7d 0d 0a 20 20 20  set x0 $x }..   
c530: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 78           if { $x
c540: 31 20 65 71 20 22 22 20 7c 7c 20 24 78 20 3e 20  1 eq "" || $x > 
c550: 24 78 31 20 7d 20 7b 20 73 65 74 20 78 31 20 24  $x1 } { set x1 $
c560: 78 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x }..           
c570: 20 69 66 20 7b 20 24 79 30 20 65 71 20 22 22 20   if { $y0 eq "" 
c580: 7c 7c 20 24 79 20 3c 20 24 79 30 20 7d 20 7b 20  || $y < $y0 } { 
c590: 73 65 74 20 79 30 20 24 79 20 7d 0d 0a 20 20 20  set y0 $y }..   
c5a0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 79           if { $y
c5b0: 31 20 65 71 20 22 22 20 7c 7c 20 24 79 20 3e 20  1 eq "" || $y > 
c5c0: 24 79 31 20 7d 20 7b 20 73 65 74 20 79 31 20 24  $y1 } { set y1 $
c5d0: 79 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  y }..        }..
c5e0: 20 20 20 20 20 20 20 20 73 65 74 20 77 20 5b 65          set w [e
c5f0: 78 70 72 20 7b 24 78 31 2d 24 78 30 7d 5d 0d 0a  xpr {$x1-$x0}]..
c600: 20 20 20 20 20 20 20 20 73 65 74 20 68 20 5b 65          set h [e
c610: 78 70 72 20 7b 24 79 31 2d 24 79 30 7d 5d 0d 0a  xpr {$y1-$y0}]..
c620: 20 20 20 20 20 20 20 20 73 65 74 20 62 62 6f 78          set bbox
c630: 20 5b 6c 69 73 74 20 24 78 30 20 24 79 30 20 24   [list $x0 $y0 $
c640: 77 20 24 68 5d 0d 0a 20 20 20 20 7d 20 65 6c 73  w $h]..    } els
c650: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
c660: 20 62 62 6f 78 20 22 22 0d 0a 20 20 20 20 7d 0d   bbox ""..    }.
c670: 0a 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20  .    if { [dict 
c680: 73 69 7a 65 20 24 63 6f 70 79 5f 69 6e 66 6f 5d  size $copy_info]
c690: 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20 20 20 20   == 0 } {..     
c6a0: 20 20 20 64 69 63 74 20 73 65 74 20 64 20 69 64     dict set d id
c6b0: 73 20 24 69 64 20 62 62 6f 78 20 24 62 62 6f 78  s $id bbox $bbox
c6c0: 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
c6d0: 20 20 20 20 20 20 20 20 61 64 64 5f 74 6f 5f 62          add_to_b
c6e0: 62 6f 78 20 5b 64 69 63 74 20 67 65 74 20 24 63  box [dict get $c
c6f0: 6f 70 79 5f 69 6e 66 6f 20 69 64 5d 20 24 62 62  opy_info id] $bb
c700: 6f 78 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0d  ox..    }..    .
c710: 0a 20 20 20 20 73 65 74 20 73 74 79 6c 65 20 22  .    set style "
c720: 22 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 22  "..    foreach "
c730: 6e 20 76 22 20 5b 64 69 63 74 20 67 65 74 20 24  n v" [dict get $
c740: 64 20 69 64 73 20 24 69 64 20 70 72 6f 70 73 5d  d ids $id props]
c750: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
c760: 20 24 6e 20 65 71 20 22 63 6c 61 73 73 22 20 7d   $n eq "class" }
c770: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c780: 61 70 70 65 6e 64 20 73 74 79 6c 65 20 22 5b 64  append style "[d
c790: 69 63 74 20 67 65 74 20 24 64 20 63 6c 61 73 73  ict get $d class
c7a0: 65 73 20 24 76 5d 22 0d 0a 20 20 20 20 20 20 20  es $v]"..       
c7b0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 61   }..    }..    a
c7c0: 70 70 65 6e 64 20 73 74 79 6c 65 20 5b 64 69 63  ppend style [dic
c7d0: 74 5f 67 65 74 64 20 24 63 6f 70 79 5f 69 6e 66  t_getd $copy_inf
c7e0: 6f 20 73 74 79 6c 65 20 22 22 5d 0d 0a 20 20 20  o style ""]..   
c7f0: 20 0d 0a 20 20 20 20 73 65 74 20 63 6d 64 20 5b   ..    set cmd [
c800: 64 69 63 74 20 67 65 74 20 24 64 20 69 64 73 20  dict get $d ids 
c810: 24 69 64 20 63 6d 64 5d 0d 0a 20 20 20 20 0d 0a  $id cmd]..    ..
c820: 20 20 20 20 73 77 69 74 63 68 20 24 63 6d 64 20      switch $cmd 
c830: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 67 69 6f  {..        regio
c840: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
c850: 20 69 66 20 7b 20 24 62 62 6f 78 20 65 71 20 22   if { $bbox eq "
c860: 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  " } {..         
c870: 20 20 20 20 20 20 20 73 65 74 5f 65 72 72 6f 72         set_error
c880: 20 24 64 20 24 69 64 20 22 72 65 67 69 6f 6e 20   $d $id "region 
c890: 6e 65 65 64 73 20 61 20 62 6f 78 20 64 65 66 69  needs a box defi
c8a0: 6e 69 74 69 6f 6e 22 0d 0a 20 20 20 20 20 20 20  nition"..       
c8b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
c8c0: 7d 0d 0a 20 20 20 20 20 20 20 20 69 6d 61 67 65  }..        image
c8d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c8e0: 6c 61 73 73 69 67 6e 20 24 62 62 6f 78 20 78 30  lassign $bbox x0
c8f0: 20 79 30 20 77 20 68 0d 0a 20 20 20 20 20 20 20   y0 w h..       
c900: 20 20 20 20 20 73 65 74 20 74 78 74 20 5b 67 69       set txt [gi
c910: 76 65 5f 70 72 6f 70 44 20 24 64 20 24 69 64 20  ve_propD $d $id 
c920: 74 65 78 74 20 22 22 5d 0d 0a 20 20 20 20 20 20  text ""]..      
c930: 20 20 20 20 20 20 73 65 74 20 65 72 72 20 5b 63        set err [c
c940: 61 74 63 68 20 7b 20 6f 70 65 6e 20 24 74 78 74  atch { open $txt
c950: 20 72 62 20 7d 20 66 69 6e 5d 0d 0a 20 20 20 20   rb } fin]..    
c960: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 65 72          if { $er
c970: 72 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  r } {..         
c980: 20 20 20 20 20 20 20 73 65 74 5f 65 72 72 6f 72         set_error
c990: 20 24 64 20 24 69 64 20 22 69 6d 61 67 65 20 27   $d $id "image '
c9a0: 24 74 78 74 27 20 6e 6f 74 20 66 6f 75 6e 64 22  $txt' not found"
c9b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
c9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
c9d0: 20 64 61 74 61 20 5b 72 65 61 64 20 24 66 69 6e   data [read $fin
c9e0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ]..            c
c9f0: 6c 6f 73 65 20 24 66 69 6e 0d 0a 20 20 20 20 20  lose $fin..     
ca00: 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20 72         package r
ca10: 65 71 75 69 72 65 20 62 61 73 65 36 34 0d 0a 20  equire base64.. 
ca20: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 68             set h
ca30: 72 65 66 20 22 64 61 74 61 3a 69 6d 61 67 65 2f  ref "data:image/
ca40: 70 6e 67 3b 62 61 73 65 36 34 2c 5b 62 61 73 65  png;base64,[base
ca50: 36 34 3a 3a 65 6e 63 6f 64 65 20 24 64 61 74 61  64::encode $data
ca60: 5d 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]"..            
ca70: 73 65 74 20 70 72 65 73 65 72 76 65 41 73 70 65  set preserveAspe
ca80: 63 74 52 61 74 69 6f 20 22 78 4d 69 6e 59 4d 69  ctRatio "xMinYMi
ca90: 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n"..            
caa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
cab0: 20 7b 20 5b 67 69 76 65 5f 70 72 6f 70 44 20 24   { [give_propD $
cac0: 64 20 24 69 64 20 61 6e 63 68 6f 72 20 22 22 5d  d $id anchor ""]
cad0: 20 6e 65 20 22 22 20 26 26 20 24 61 6e 63 68 6f   ne "" && $ancho
cae0: 72 58 20 3d 3d 20 30 20 26 26 20 24 61 6e 63 68  rX == 0 && $anch
caf0: 6f 72 59 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20  orY == 0 } {..  
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
cb10: 74 20 70 72 65 73 65 72 76 65 41 73 70 65 63 74  t preserveAspect
cb20: 52 61 74 69 6f 20 22 6e 6f 6e 65 22 0d 0a 20 20  Ratio "none"..  
cb30: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
cb40: 20 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20           ..     
cb50: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d         append xm
cb60: 6c 20 22 3c 69 6d 61 67 65 20 78 3d 27 24 78 30  l "<image x='$x0
cb70: 27 20 79 3d 27 24 79 30 27 20 77 69 64 74 68 3d  ' y='$y0' width=
cb80: 27 24 77 27 20 68 65 69 67 68 74 3d 27 24 68 27  '$w' height='$h'
cb90: 20 69 64 3d 27 24 69 64 27 20 73 74 79 6c 65 3d   id='$id' style=
cba0: 27 24 73 74 79 6c 65 27 20 22 0d 0a 20 20 20 20  '$style' "..    
cbb0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 78          append x
cbc0: 6d 6c 20 22 78 6c 69 6e 6b 3a 68 72 65 66 3d 27  ml "xlink:href='
cbd0: 24 68 72 65 66 27 20 70 72 65 73 65 72 76 65 41  $href' preserveA
cbe0: 73 70 65 63 74 52 61 74 69 6f 3d 27 24 70 72 65  spectRatio='$pre
cbf0: 73 65 72 76 65 41 73 70 65 63 74 52 61 74 69 6f  serveAspectRatio
cc00: 27 2f 3e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  '/>"..          
cc10: 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20    ..            
cc20: 69 66 20 7b 20 5b 72 65 67 65 78 70 20 7b 62 6f  if { [regexp {bo
cc30: 72 64 65 72 2d 73 74 72 6f 6b 65 2d 77 69 64 74  rder-stroke-widt
cc40: 68 3a 5c 73 2a 28 28 5c 64 2b 29 5b 5e 3b 5d 2b  h:\s*((\d+)[^;]+
cc50: 29 7d 20 24 73 74 79 6c 65 20 7b 7d 20 76 61 6c  )} $style {} val
cc60: 75 65 20 6e 75 6d 5d 20 26 26 20 24 6e 75 6d 20  ue num] && $num 
cc70: 3e 20 30 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  > 0 } {..       
cc80: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 72           if { [r
cc90: 65 67 65 78 70 20 7b 62 6f 72 64 65 72 2d 73 74  egexp {border-st
cca0: 72 6f 6b 65 3a 5c 73 2a 28 5b 5e 3b 5d 2b 29 7d  roke:\s*([^;]+)}
ccb0: 20 24 73 74 79 6c 65 20 7b 7d 20 73 5d 20 7d 20   $style {} s] } 
ccc0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
ccd0: 20 20 20 20 20 20 20 73 65 74 20 73 74 72 6f 6b         set strok
cce0: 65 20 24 73 0d 0a 20 20 20 20 20 20 20 20 20 20  e $s..          
ccf0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 20 20 20 73 65 74 20 73 74 72 6f 6b 65 20 62      set stroke b
cd20: 6c 61 63 6b 20 20 20 0d 0a 20 20 20 20 20 20 20  lack   ..       
cd30: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
cd50: 73 74 79 6c 65 42 20 22 24 73 74 79 6c 65 3b 73  styleB "$style;s
cd60: 74 72 6f 6b 65 2d 77 69 64 74 68 3a 24 76 61 6c  troke-width:$val
cd70: 75 65 3b 73 74 72 6f 6b 65 3a 24 73 74 72 6f 6b  ue;stroke:$strok
cd80: 65 3b 66 69 6c 6c 3a 6e 6f 6e 65 3b 22 0d 0a 20  e;fill:none;".. 
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0d                 .
cda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cdb0: 20 69 66 20 7b 20 24 70 72 65 73 65 72 76 65 41   if { $preserveA
cdc0: 73 70 65 63 74 52 61 74 69 6f 20 6e 65 20 22 6e  spectRatio ne "n
cdd0: 6f 6e 65 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20  one" } {..      
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
cdf0: 73 73 69 67 6e 20 5b 70 6e 67 73 69 7a 65 5f 64  ssign [pngsize_d
ce00: 61 74 61 20 24 64 61 74 61 5d 20 77 69 64 74 68  ata $data] width
ce10: 20 68 65 69 67 68 74 0d 0a 20 20 20 20 20 20 20   height..       
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
ce30: 20 72 31 20 5b 65 78 70 72 20 7b 64 6f 75 62 6c   r1 [expr {doubl
ce40: 65 28 24 77 29 2f 24 68 7d 5d 0d 0a 20 20 20 20  e($w)/$h}]..    
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 73 65 74 20 72 32 20 5b 65 78 70 72 20 7b 64 6f  set r2 [expr {do
ce70: 75 62 6c 65 28 24 77 69 64 74 68 29 2f 24 68 65  uble($width)/$he
ce80: 69 67 68 74 7d 5d 0d 0a 20 20 20 20 20 20 20 20  ight}]..        
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
cea0: 20 24 72 32 20 3e 20 24 72 31 20 7d 20 7b 0d 0a   $r2 > $r1 } {..
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 20 20 73 65 74 20 68 20 5b 65          set h [e
ced0: 78 70 72 20 7b 24 68 2a 24 72 31 2f 24 72 32 7d  xpr {$h*$r1/$r2}
cee0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
cef0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
cf00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf10: 20 20 20 20 20 20 20 20 20 73 65 74 20 77 20 5b           set w [
cf20: 65 78 70 72 20 7b 24 77 2a 24 72 32 2f 24 72 31  expr {$w*$r2/$r1
cf30: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
cf40: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0d                 .
cf60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf70: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
cf80: 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20 22      append xml "
cf90: 3c 72 65 63 74 20 78 3d 27 24 78 30 27 20 79 3d  <rect x='$x0' y=
cfa0: 27 24 79 30 27 20 77 69 64 74 68 3d 27 24 77 27  '$y0' width='$w'
cfb0: 20 68 65 69 67 68 74 3d 27 24 68 27 20 22 0d 0a   height='$h' "..
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 61 70 70 65 6e 64 20 78 6d 6c 20 22 69 64 3d 27  append xml "id='
cfe0: 24 69 64 2d 62 6f 72 64 65 72 27 20 73 74 79 6c  $id-border' styl
cff0: 65 3d 27 24 73 74 79 6c 65 42 27 2f 3e 22 0d 0a  e='$styleB'/>"..
d000: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
d010: 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20 20             ..   
d020: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 64           if { [d
d030: 69 63 74 20 73 69 7a 65 20 24 63 6f 70 79 5f 69  ict size $copy_i
d040: 6e 66 6f 5d 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20  nfo] == 0 } {.. 
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
d060: 69 63 74 20 73 65 74 20 64 20 69 64 73 20 24 69  ict set d ids $i
d070: 64 20 62 62 6f 78 4c 20 24 62 62 6f 78 0d 0a 20  d bboxL $bbox.. 
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
d090: 69 63 74 20 73 65 74 20 64 20 69 64 73 20 24 69  ict set d ids $i
d0a0: 64 20 61 6e 67 6c 65 20 30 0d 0a 20 20 20 20 20  d angle 0..     
d0b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
d0c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 63    }..        rec
d0d0: 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t {..           
d0e0: 20 6c 61 73 73 69 67 6e 20 24 62 62 6f 78 20 78   lassign $bbox x
d0f0: 30 20 79 30 20 77 20 68 0d 0a 20 20 20 20 20 20  0 y0 w h..      
d100: 20 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c        append xml
d110: 20 22 3c 72 65 63 74 20 78 3d 27 24 78 30 27 20   "<rect x='$x0' 
d120: 79 3d 27 24 79 30 27 20 77 69 64 74 68 3d 27 24  y='$y0' width='$
d130: 77 27 20 68 65 69 67 68 74 3d 27 24 68 27 20 69  w' height='$h' i
d140: 64 3d 27 24 69 64 27 20 73 74 79 6c 65 3d 27 24  d='$id' style='$
d150: 73 74 79 6c 65 27 22 0d 0a 20 20 20 20 20 20 20  style'"..       
d160: 20 20 20 20 20 69 66 20 7b 20 5b 72 65 67 65 78       if { [regex
d170: 70 20 7b 62 6f 72 64 65 72 2d 72 61 64 69 75 73  p {border-radius
d180: 5c 73 2a 3a 5c 73 2a 28 5c 64 2b 29 7d 20 24 73  \s*:\s*(\d+)} $s
d190: 74 79 6c 65 20 7b 7d 20 72 5d 20 7d 20 7b 0d 0a  tyle {} r] } {..
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 61 70 70 65 6e 64 20 78 6d 6c 20 22 20 72 78 3d  append xml " rx=
d1c0: 27 24 72 27 20 72 79 3d 27 24 72 27 22 0d 0a 20  '$r' ry='$r'".. 
d1d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
d1e0: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
d1f0: 20 78 6d 6c 20 22 2f 3e 5c 6e 22 0d 0a 20 20 20   xml "/>\n"..   
d200: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 64           if { [d
d210: 69 63 74 20 73 69 7a 65 20 24 63 6f 70 79 5f 69  ict size $copy_i
d220: 6e 66 6f 5d 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20  nfo] == 0 } {.. 
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
d240: 69 63 74 20 73 65 74 20 64 20 69 64 73 20 24 69  ict set d ids $i
d250: 64 20 62 62 6f 78 4c 20 24 62 62 6f 78 0d 0a 20  d bboxL $bbox.. 
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
d270: 69 63 74 20 73 65 74 20 64 20 69 64 73 20 24 69  ict set d ids $i
d280: 64 20 61 6e 67 6c 65 20 30 0d 0a 20 20 20 20 20  d angle 0..     
d290: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
d2a0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 63 69 72    }..        cir
d2b0: 63 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  cle {..         
d2c0: 20 20 20 6c 61 73 73 69 67 6e 20 24 62 62 6f 78     lassign $bbox
d2d0: 20 78 30 20 79 30 20 77 20 68 0d 0a 20 20 20 20   x0 y0 w h..    
d2e0: 20 20 20 20 20 20 20 20 73 65 74 20 63 78 20 5b          set cx [
d2f0: 65 78 70 72 20 7b 24 78 30 2b 30 2e 35 2a 24 77  expr {$x0+0.5*$w
d300: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
d310: 73 65 74 20 63 79 20 5b 65 78 70 72 20 7b 24 79  set cy [expr {$y
d320: 30 2b 30 2e 35 2a 24 68 7d 5d 0d 0a 20 20 20 20  0+0.5*$h}]..    
d330: 20 20 20 20 20 20 20 20 73 65 74 20 72 20 5b 65          set r [e
d340: 78 70 72 20 7b 30 2e 35 2a 24 77 7d 5d 0d 0a 20  xpr {0.5*$w}].. 
d350: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
d360: 64 20 78 6d 6c 20 22 3c 63 69 72 63 6c 65 20 63  d xml "<circle c
d370: 78 3d 27 24 63 78 27 20 63 79 3d 27 24 63 79 27  x='$cx' cy='$cy'
d380: 20 72 3d 27 24 72 27 20 69 64 3d 27 24 69 64 27   r='$r' id='$id'
d390: 20 73 74 79 6c 65 3d 27 24 73 74 79 6c 65 27 2f   style='$style'/
d3a0: 3e 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20  >\n"..          
d3b0: 20 20 69 66 20 7b 20 5b 64 69 63 74 20 73 69 7a    if { [dict siz
d3c0: 65 20 24 63 6f 70 79 5f 69 6e 66 6f 5d 20 3d 3d  e $copy_info] ==
d3d0: 20 30 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20   0 } {..        
d3e0: 20 20 20 20 20 20 20 20 64 69 63 74 20 73 65 74          dict set
d3f0: 20 64 20 69 64 73 20 24 69 64 20 62 62 6f 78 4c   d ids $id bboxL
d400: 20 24 62 62 6f 78 0d 0a 20 20 20 20 20 20 20 20   $bbox..        
d410: 20 20 20 20 20 20 20 20 64 69 63 74 20 73 65 74          dict set
d420: 20 64 20 69 64 73 20 24 69 64 20 61 6e 67 6c 65   d ids $id angle
d430: 20 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   0..            
d440: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
d450: 20 20 20 20 20 20 63 75 62 65 20 7b 0d 0a 20 20        cube {..  
d460: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6c 61            set la
d470: 62 65 6c 73 20 5b 67 69 76 65 5f 70 72 6f 70 44  bels [give_propD
d480: 20 24 64 20 24 69 64 20 6c 61 62 65 6c 73 20 22   $d $id labels "
d490: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
d4a0: 69 66 20 7b 20 24 6c 61 62 65 6c 73 20 69 6e 20  if { $labels in 
d4b0: 5b 6c 69 73 74 20 22 22 20 30 5d 20 26 26 20 5b  [list "" 0] && [
d4c0: 64 69 63 74 20 65 78 69 73 74 73 20 24 63 6f 70  dict exists $cop
d4d0: 79 5f 69 6e 66 6f 20 6c 61 62 65 6c 73 5d 20 7d  y_info labels] }
d4e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d4f0: 20 20 20 20 73 65 74 20 6c 61 62 65 6c 73 20 5b      set labels [
d500: 64 69 63 74 20 67 65 74 20 24 63 6f 70 79 5f 69  dict get $copy_i
d510: 6e 66 6f 20 6c 61 62 65 6c 73 5d 0d 0a 20 20 20  nfo labels]..   
d520: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
d530: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 6c 61          if { $la
d540: 62 65 6c 73 20 6e 65 20 22 22 20 26 26 20 24 6c  bels ne "" && $l
d550: 61 62 65 6c 73 20 6e 65 20 22 30 22 20 7d 20 7b  abels ne "0" } {
d560: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d570: 20 20 69 66 20 7b 20 24 6c 61 62 65 6c 73 20 6e    if { $labels n
d580: 69 20 22 76 65 72 74 65 78 20 61 72 69 73 74 65  i "vertex ariste
d590: 20 66 61 63 65 22 20 7d 20 7b 0d 0a 20 20 20 20   face" } {..    
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 73 65 74 20 6c 61 62 65 6c 73 20 61 6c 6c 0d 0a  set labels all..
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
d5e0: 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20 5b 70     append xml [p
d5f0: 72 6f 63 65 73 73 5f 63 75 62 65 20 24 69 64 20  rocess_cube $id 
d600: 64 72 61 77 5f 6c 61 62 65 6c 73 20 24 6c 61 62  draw_labels $lab
d610: 65 6c 73 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  els]..          
d620: 20 20 20 20 20 20 61 70 70 65 6e 64 20 73 74 79        append sty
d630: 6c 65 20 22 66 69 6c 6c 3a 6e 6f 6e 65 3b 22 0d  le "fill:none;".
d640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
d650: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
d660: 66 61 63 65 73 20 5b 70 72 6f 63 65 73 73 5f 63  faces [process_c
d670: 75 62 65 20 24 69 64 20 66 61 63 65 73 5d 0d 0a  ube $id faces]..
d680: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
d690: 61 63 68 20 66 61 63 65 20 24 66 61 63 65 73 20  ach face $faces 
d6a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
d6b0: 20 20 20 73 65 74 20 64 73 20 22 22 0d 0a 20 20     set ds ""..  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
d6d0: 72 20 7b 20 73 65 74 20 69 20 30 20 7d 20 7b 20  r { set i 0 } { 
d6e0: 24 69 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 66  $i < [llength $f
d6f0: 61 63 65 5d 20 7d 20 7b 20 69 6e 63 72 20 69 20  ace] } { incr i 
d700: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
d710: 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 69           if { $i
d720: 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20 20 20 20   == 0 } {..     
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 73 65 74 20 69 64 78 5f 66 61 63 65 20     set idx_face 
d750: 5b 6c 69 6e 64 65 78 20 24 66 61 63 65 20 24 69  [lindex $face $i
d760: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
d770: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
d780: 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nue..           
d790: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 73 65 74 20 70 6e 74 20 5b 6c 69 6e 64 65 78 20  set pnt [lindex 
d7c0: 24 66 61 63 65 20 24 69 5d 0d 0a 20 20 20 20 20  $face $i]..     
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
d7e0: 66 20 7b 20 24 64 73 20 65 71 20 22 22 20 7d 20  f { $ds eq "" } 
d7f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
d800: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
d810: 64 20 64 73 20 22 4d 24 70 6e 74 22 0d 0a 20 20  d ds "M$pnt"..  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 61 70 70 65 6e 64 20 64 73 20 22 20      append ds " 
d860: 4c 24 70 6e 74 22 0d 0a 20 20 20 20 20 20 20 20  L$pnt"..        
d870: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
d890: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d8a0: 20 20 61 70 70 65 6e 64 20 64 73 20 22 7a 22 0d    append ds "z".
d8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d8c0: 20 61 70 70 65 6e 64 20 78 6d 6c 20 22 3c 70 61   append xml "<pa
d8d0: 74 68 20 64 3d 27 24 64 73 27 20 69 64 3d 27 24  th d='$ds' id='$
d8e0: 69 64 2d 24 69 64 78 5f 66 61 63 65 27 20 73 74  id-$idx_face' st
d8f0: 79 6c 65 3d 27 24 73 74 79 6c 65 27 2f 3e 5c 6e  yle='$style'/>\n
d900: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  "..            }
d910: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a  ..            ..
d920: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
d930: 20 5b 64 69 63 74 20 73 69 7a 65 20 24 63 6f 70   [dict size $cop
d940: 79 5f 69 6e 66 6f 5d 20 3d 3d 20 30 20 7d 20 7b  y_info] == 0 } {
d950: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d960: 20 20 64 69 63 74 20 73 65 74 20 64 20 69 64 73    dict set d ids
d970: 20 24 69 64 20 62 62 6f 78 4c 20 24 62 62 6f 78   $id bboxL $bbox
d980: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d990: 20 20 64 69 63 74 20 73 65 74 20 64 20 69 64 73    dict set d ids
d9a0: 20 24 69 64 20 61 6e 67 6c 65 20 30 0d 0a 20 20   $id angle 0..  
d9b0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
d9c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
d9d0: 6c 69 6e 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  line {..        
d9e0: 20 20 20 20 73 65 74 20 6c 61 62 65 6c 73 20 5b      set labels [
d9f0: 67 69 76 65 5f 70 72 6f 70 44 20 24 64 20 24 69  give_propD $d $i
da00: 64 20 6c 61 62 65 6c 73 20 22 22 5d 0d 0a 20 20  d labels ""]..  
da10: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24            if { $
da20: 6c 61 62 65 6c 73 20 69 6e 20 5b 6c 69 73 74 20  labels in [list 
da30: 22 22 20 30 5d 20 26 26 20 5b 64 69 63 74 20 65  "" 0] && [dict e
da40: 78 69 73 74 73 20 24 63 6f 70 79 5f 69 6e 66 6f  xists $copy_info
da50: 20 6c 61 62 65 6c 73 5d 20 7d 20 7b 0d 0a 20 20   labels] } {..  
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
da70: 74 20 6c 61 62 65 6c 73 20 5b 64 69 63 74 20 67  t labels [dict g
da80: 65 74 20 24 63 6f 70 79 5f 69 6e 66 6f 20 6c 61  et $copy_info la
da90: 62 65 6c 73 5d 0d 0a 20 20 20 20 20 20 20 20 20  bels]..         
daa0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
dab0: 20 20 69 66 20 7b 20 24 6c 61 62 65 6c 73 20 6e    if { $labels n
dac0: 65 20 22 22 20 26 26 20 24 6c 61 62 65 6c 73 20  e "" && $labels 
dad0: 6e 65 20 22 30 22 20 7d 20 7b 0d 0a 20 20 20 20  ne "0" } {..    
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
daf0: 6c 61 62 65 6c 73 46 6c 61 67 20 31 0d 0a 20 20  labelsFlag 1..  
db00: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
db10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
db20: 20 20 20 20 73 65 74 20 6c 61 62 65 6c 73 46 6c      set labelsFl
db30: 61 67 20 30 20 20 20 0d 0a 20 20 20 20 20 20 20  ag 0   ..       
db40: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
db50: 20 20 20 20 73 65 74 20 6c 61 62 65 6c 73 4c 69      set labelsLi
db60: 73 74 20 5b 73 70 6c 69 74 20 24 6c 61 62 65 6c  st [split $label
db70: 73 20 2c 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  s ,]..          
db80: 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20    if { [llength 
db90: 24 6c 61 62 65 6c 73 4c 69 73 74 5d 20 3c 20 32  $labelsList] < 2
dba0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
dbb0: 20 20 20 20 20 20 73 65 74 20 6c 61 62 65 6c 73        set labels
dbc0: 4c 69 73 74 20 22 22 0d 0a 20 20 20 20 20 20 20  List ""..       
dbd0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
dbe0: 20 20 20 20 6c 61 73 73 69 67 6e 20 22 22 20 64      lassign "" d
dbf0: 73 20 74 79 70 65 5f 70 72 65 76 20 70 6e 74 73  s type_prev pnts
dc00: 5f 74 65 78 74 0d 0a 20 20 20 20 20 20 20 20 20  _text..         
dc10: 20 20 20 66 6f 72 20 7b 20 73 65 74 20 69 20 30     for { set i 0
dc20: 20 7d 20 7b 20 24 69 20 3c 20 5b 6c 6c 65 6e 67   } { $i < [lleng
dc30: 74 68 20 24 70 6e 74 73 5d 20 7d 20 7b 20 69 6e  th $pnts] } { in
dc40: 63 72 20 69 20 7d 20 7b 0d 0a 20 20 20 20 20 20  cr i } {..      
dc50: 20 20 20 20 20 20 20 20 20 20 6c 61 73 73 69 67            lassig
dc60: 6e 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 73 20  n [lindex $pnts 
dc70: 24 69 5d 20 74 79 70 65 20 78 20 79 0d 0a 20 20  $i] type x y..  
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
dc90: 20 7b 20 24 64 73 20 65 71 20 22 22 20 7d 20 7b   { $ds eq "" } {
dca0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
dcb0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 73 20        append ds 
dcc0: 5b 66 6f 72 6d 61 74 20 22 4d 25 2e 33 67 2c 25  [format "M%.3g,%
dcd0: 2e 33 67 22 20 24 78 20 24 79 5d 0d 0a 20 20 20  .3g" $x $y]..   
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 6c 61 70 70 65 6e 64 20 70 6e 74 73 5f 74 65   lappend pnts_te
dd00: 78 74 20 22 24 78 20 24 79 22 0d 0a 20 20 20 20  xt "$x $y"..    
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
dd20: 73 65 69 66 20 7b 20 24 74 79 70 65 20 69 6e 20  seif { $type in 
dd30: 22 70 6f 69 6e 74 20 4c 22 20 26 26 20 24 74 79  "point L" && $ty
dd40: 70 65 5f 70 72 65 76 20 69 6e 20 22 71 20 51 20  pe_prev in "q Q 
dd50: 43 20 63 20 43 32 20 63 32 22 20 7d 20 7b 0d 0a  C c C2 c2" } {..
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 61 70 70 65 6e 64 20 64 73 20 5b 66      append ds [f
dd80: 6f 72 6d 61 74 20 22 20 25 2e 33 67 2c 25 2e 33  ormat " %.3g,%.3
dd90: 67 22 20 24 78 20 24 79 5d 0d 0a 20 20 20 20 20  g" $x $y]..     
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
ddb0: 61 70 70 65 6e 64 20 70 6e 74 73 5f 74 65 78 74  append pnts_text
ddc0: 20 22 24 78 20 24 79 22 0d 0a 20 20 20 20 20 20   "$x $y"..      
ddd0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
dde0: 69 66 20 7b 20 24 74 79 70 65 20 69 6e 20 22 70  if { $type in "p
ddf0: 6f 69 6e 74 20 4c 20 4d 22 20 7d 20 7b 0d 0a 20  oint L M" } {.. 
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 61 70 70 65 6e 64 20 64 73 20 5b 66 6f     append ds [fo
de20: 72 6d 61 74 20 22 20 4c 25 2e 33 67 2c 25 2e 33  rmat " L%.3g,%.3
de30: 67 22 20 24 78 20 24 79 5d 0d 0a 20 20 20 20 20  g" $x $y]..     
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
de50: 61 70 70 65 6e 64 20 70 6e 74 73 5f 74 65 78 74  append pnts_text
de60: 20 22 24 78 20 24 79 22 0d 0a 20 20 20 20 20 20   "$x $y"..      
de70: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
de80: 69 66 20 7b 20 24 74 79 70 65 20 69 6e 20 22 64  if { $type in "d
de90: 65 6c 74 61 2d 70 6f 69 6e 74 20 6c 20 63 32 22  elta-point l c2"
dea0: 20 26 26 20 24 74 79 70 65 5f 70 72 65 76 20 69   && $type_prev i
deb0: 6e 20 22 71 20 51 20 43 20 63 20 43 32 20 63 32  n "q Q C c C2 c2
dec0: 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  " } {..         
ded0: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
dee0: 64 20 64 73 20 5b 66 6f 72 6d 61 74 20 22 20 25  d ds [format " %
def0: 2e 33 67 2c 25 2e 33 67 22 20 24 78 20 24 79 5d  .3g,%.3g" $x $y]
df00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
df10: 20 20 20 20 20 20 73 65 74 20 70 6e 74 20 5b 6d        set pnt [m
df20: 3a 3a 61 64 64 20 5b 6c 69 6e 64 65 78 20 24 70  ::add [lindex $p
df30: 6e 74 73 5f 74 65 78 74 20 65 6e 64 5d 20 22 24  nts_text end] "$
df40: 78 20 24 79 22 5d 0d 0a 20 20 20 20 20 20 20 20  x $y"]..        
df50: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
df60: 65 6e 64 20 70 6e 74 73 5f 74 65 78 74 20 24 70  end pnts_text $p
df70: 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt..            
df80: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24      } elseif { $
df90: 74 79 70 65 20 69 6e 20 22 64 65 6c 74 61 2d 70  type in "delta-p
dfa0: 6f 69 6e 74 20 6c 20 6d 22 20 7d 20 7b 0d 0a 20  oint l m" } {.. 
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 61 70 70 65 6e 64 20 64 73 20 5b 66 6f     append ds [fo
dfd0: 72 6d 61 74 20 22 20 6c 25 2e 33 67 2c 25 2e 33  rmat " l%.3g,%.3
dfe0: 67 22 20 24 78 20 24 79 5d 0d 0a 20 20 20 20 20  g" $x $y]..     
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
e000: 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 70 6e  f { [llength $pn
e010: 74 73 5f 74 65 78 74 5d 20 7d 20 7b 0d 0a 20 20  ts_text] } {..  
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 73 65 74 20 70 6e 74 20 5b 6d        set pnt [m
e040: 3a 3a 61 64 64 20 5b 6c 69 6e 64 65 78 20 24 70  ::add [lindex $p
e050: 6e 74 73 5f 74 65 78 74 20 65 6e 64 5d 20 22 24  nts_text end] "$
e060: 78 20 24 79 22 5d 0d 0a 20 20 20 20 20 20 20 20  x $y"]..        
e070: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
e080: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
e0a0: 74 20 70 6e 74 20 22 24 78 20 24 79 22 0d 0a 20  t pnt "$x $y".. 
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
e0d0: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
e0e0: 64 20 70 6e 74 73 5f 74 65 78 74 20 24 70 6e 74  d pnts_text $pnt
e0f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e100: 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24 74 79    } elseif { $ty
e110: 70 65 20 69 6e 20 22 71 20 51 22 20 7d 20 7b 0d  pe in "q Q" } {.
e120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e130: 20 20 20 20 20 61 70 70 65 6e 64 20 64 73 20 5b       append ds [
e140: 66 6f 72 6d 61 74 20 22 20 25 73 25 2e 33 67 2c  format " %s%.3g,
e150: 25 2e 33 67 22 20 24 74 79 70 65 20 24 78 20 24  %.3g" $type $x $
e160: 79 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y]..            
e170: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24      } elseif { $
e180: 74 79 70 65 20 69 6e 20 22 63 20 43 22 20 7d 20  type in "c C" } 
e190: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
e1a0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 73         append ds
e1b0: 20 5b 66 6f 72 6d 61 74 20 22 20 25 73 25 2e 33   [format " %s%.3
e1c0: 67 2c 25 2e 33 67 22 20 24 74 79 70 65 20 24 78  g,%.3g" $type $x
e1d0: 20 24 79 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   $y]..          
e1e0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
e1f0: 20 24 74 79 70 65 20 69 6e 20 22 43 32 22 20 7d   $type in "C2" }
e200: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
e210: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64          append d
e220: 73 20 5b 66 6f 72 6d 61 74 20 22 20 25 2e 33 67  s [format " %.3g
e230: 2c 25 2e 33 67 22 20 24 78 20 24 79 5d 0d 0a 20  ,%.3g" $x $y].. 
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e250: 20 65 6c 73 65 69 66 20 7b 20 24 74 79 70 65 20   elseif { $type 
e260: 69 6e 20 22 61 20 41 22 20 7d 20 7b 0d 0a 20 20  in "a A" } {..  
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 6c 61 73 73 69 67 6e 20 5b 6c 69 6e 64 65    lassign [linde
e290: 78 20 24 70 6e 74 73 20 24 69 5d 20 74 79 70 65  x $pnts $i] type
e2a0: 20 78 20 79 20 7a 20 70 61 72 61 6d 65 74 65 72   x y z parameter
e2b0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
e2c0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 73         append ds
e2d0: 20 22 20 24 74 79 70 65 20 5b 6a 6f 69 6e 20 24   " $type [join $
e2e0: 70 61 72 61 6d 65 74 65 72 73 20 2c 5d 22 20 5b  parameters ,]" [
e2f0: 66 6f 72 6d 61 74 20 22 20 25 2e 33 67 2c 25 2e  format " %.3g,%.
e300: 33 67 22 20 24 78 20 24 79 5d 0d 0a 20 20 20 20  3g" $x $y]..    
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 69 66 20 7b 20 24 74 79 70 65 20 65 71 20 22 41  if { $type eq "A
e330: 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  " } {..         
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
e350: 61 70 70 65 6e 64 20 70 6e 74 73 5f 74 65 78 74  append pnts_text
e360: 20 22 24 78 20 24 79 22 0d 0a 20 20 20 20 20 20   "$x $y"..      
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
e380: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 73 65 74 20 70 6e 74 20 5b 6d 3a 3a 61 64 64 20  set pnt [m::add 
e3b0: 5b 6c 69 6e 64 65 78 20 24 70 6e 74 73 5f 74 65  [lindex $pnts_te
e3c0: 78 74 20 65 6e 64 5d 20 22 24 78 20 24 79 22 5d  xt end] "$x $y"]
e3d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e3e0: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
e3f0: 64 20 70 6e 74 73 5f 74 65 78 74 20 24 70 6e 74  d pnts_text $pnt
e400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e410: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e420: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
e430: 66 20 7b 20 24 74 79 70 65 20 69 6e 20 22 7a 20  f { $type in "z 
e440: 5a 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  Z" } {..        
e450: 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
e460: 6e 64 20 64 73 20 22 20 24 74 79 70 65 22 0d 0a  nd ds " $type"..
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
e490: 20 20 20 73 65 74 20 74 79 70 65 5f 70 72 65 76     set type_prev
e4a0: 20 24 74 79 70 65 0d 0a 20 20 20 20 20 20 20 20   $type..        
e4b0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
e4c0: 20 20 20 69 66 20 7b 20 24 6c 61 62 65 6c 73 46     if { $labelsF
e4d0: 6c 61 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  lag } {..       
e4e0: 20 20 20 20 20 20 20 20 20 73 65 74 20 69 64 78           set idx
e4f0: 20 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   1..            
e500: 20 20 20 20 66 6f 72 65 61 63 68 20 69 20 24 70      foreach i $p
e510: 6e 74 73 5f 74 65 78 74 20 7b 0d 0a 20 20 20 20  nts_text {..    
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 6c 61 73 73 69 67 6e 20 24 69 20 78 20 79 0d 0a  lassign $i x y..
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e550: 20 20 20 20 73 65 74 20 78 20 5b 65 78 70 72 20      set x [expr 
e560: 7b 24 78 2b 35 7d 5d 0d 0a 20 20 20 20 20 20 20  {$x+5}]..       
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
e580: 20 79 20 5b 65 78 70 72 20 7b 24 79 2d 35 7d 5d   y [expr {$y-5}]
e590: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e5a0: 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 6c 65 6e        if { [llen
e5b0: 67 74 68 20 24 6c 61 62 65 6c 73 4c 69 73 74 5d  gth $labelsList]
e5c0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
e5e0: 74 20 74 78 74 20 5b 6c 69 6e 64 65 78 20 24 6c  t txt [lindex $l
e5f0: 61 62 65 6c 73 4c 69 73 74 20 24 69 64 78 2d 31  abelsList $idx-1
e600: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
e610: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
e620: 7b 20 24 69 64 78 20 3d 3d 20 31 20 7d 20 7b 0d  { $idx == 1 } {.
e630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e640: 20 20 20 20 20 20 20 20 20 73 65 74 20 74 78 74           set txt
e650: 20 22 24 69 64 3a 20 24 69 64 78 22 20 20 20 0d   "$id: $idx"   .
e660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e670: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 20 20 20 20 20 20 73 65 74 20 74 78 74 20 22         set txt "
e6a0: 24 69 64 78 22 0d 0a 20 20 20 20 20 20 20 20 20  $idx"..         
e6b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 73 65 74 20 73 74 79 6c 65 54 20 22 66 6f    set styleT "fo
e6e0: 6e 74 2d 73 69 7a 65 3a 20 31 38 70 78 3b 20 66  nt-size: 18px; f
e6f0: 69 6c 6c 3a 20 62 6c 61 63 6b 3b 20 66 6f 6e 74  ill: black; font
e700: 2d 66 61 6d 69 6c 79 3a 20 73 61 6e 73 2d 73 65  -family: sans-se
e710: 72 69 66 3b 22 0d 0a 20 20 20 20 20 20 20 20 20  rif;"..         
e720: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
e730: 64 20 78 6d 6c 20 5b 66 6f 72 6d 61 74 20 22 3c  d xml [format "<
e740: 74 65 78 74 20 78 3d 27 25 2e 33 67 27 20 79 3d  text x='%.3g' y=
e750: 27 25 2e 33 67 27 20 74 65 78 74 2d 61 6e 63 68  '%.3g' text-anch
e760: 6f 72 3d 27 73 74 61 72 74 27 20 73 74 79 6c 65  or='start' style
e770: 3d 27 25 73 27 3e 5c 6e 22 20 5c 0d 0a 20 20 20  ='%s'>\n" \..   
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 20 20 20 20 20 20 20 20 24 78 20 24 79 20 24           $x $y $
e7a0: 73 74 79 6c 65 54 5d 0d 0a 20 20 20 20 20 20 20  styleT]..       
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
e7c0: 65 6e 64 20 78 6d 6c 20 5b 61 70 70 65 6e 64 5f  end xml [append_
e7d0: 74 73 70 61 6e 73 20 24 78 20 24 74 78 74 5d 0d  tspans $x $txt].
e7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e7f0: 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20       append xml 
e800: 22 3c 2f 74 65 78 74 3e 5c 6e 22 0d 0a 20 20 20  "</text>\n"..   
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 69 6e 63 72 20 69 64 78 0d 0a 20 20 20 20 20   incr idx..     
e830: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
e850: 70 65 6e 64 20 73 74 79 6c 65 20 22 6d 61 72 6b  pend style "mark
e860: 65 72 2d 73 74 61 72 74 3a 75 72 6c 28 23 63 69  er-start:url(#ci
e870: 72 63 6c 65 29 3b 6d 61 72 6b 65 72 2d 6d 69 64  rcle);marker-mid
e880: 3a 75 72 6c 28 23 63 69 72 63 6c 65 29 3b 22 0d  :url(#circle);".
e890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e8a0: 20 61 70 70 65 6e 64 20 73 74 79 6c 65 20 22 6d   append style "m
e8b0: 61 72 6b 65 72 2d 65 6e 64 3a 75 72 6c 28 23 63  arker-end:url(#c
e8c0: 69 72 63 6c 65 29 3b 22 0d 0a 20 20 20 20 20 20  ircle);"..      
e8d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e8e0: 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20       append xml 
e8f0: 22 3c 70 61 74 68 20 64 3d 27 24 64 73 27 20 69  "<path d='$ds' i
e900: 64 3d 27 24 69 64 27 20 73 74 79 6c 65 3d 27 24  d='$id' style='$
e910: 73 74 79 6c 65 27 2f 3e 5c 6e 22 0d 0a 20 20 20  style'/>\n"..   
e920: 20 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20           ..     
e930: 20 20 20 20 20 20 20 73 65 74 20 70 6e 74 31 20         set pnt1 
e940: 5b 6c 69 6e 64 65 78 20 24 70 6e 74 73 42 42 4f  [lindex $pntsBBO
e950: 58 20 31 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  X 1]..          
e960: 20 20 73 65 74 20 70 6e 74 30 20 5b 6c 69 6e 64    set pnt0 [lind
e970: 65 78 20 24 70 6e 74 73 42 42 4f 58 20 30 5d 0d  ex $pntsBBOX 0].
e980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
e990: 20 4c 20 5b 6d 3a 3a 6e 6f 72 6d 20 5b 6d 3a 3a   L [m::norm [m::
e9a0: 73 75 62 20 24 70 6e 74 31 20 24 70 6e 74 30 5d  sub $pnt1 $pnt0]
e9b0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ]..            s
e9c0: 65 74 20 61 6e 67 6c 65 20 5b 65 78 70 72 20 7b  et angle [expr {
e9d0: 61 74 61 6e 32 28 5b 6c 69 6e 64 65 78 20 24 70  atan2([lindex $p
e9e0: 6e 74 31 20 31 5d 2d 5b 6c 69 6e 64 65 78 20 24  nt1 1]-[lindex $
e9f0: 70 6e 74 30 20 31 5d 2c 0d 0a 20 20 20 20 20 20  pnt0 1],..      
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c                [l
ea10: 69 6e 64 65 78 20 24 70 6e 74 31 20 30 5d 2d 5b  index $pnt1 0]-[
ea20: 6c 69 6e 64 65 78 20 24 70 6e 74 30 20 30 5d 29  lindex $pnt0 0])
ea30: 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
ea40: 69 66 20 7b 20 5b 64 69 63 74 20 73 69 7a 65 20  if { [dict size 
ea50: 24 63 6f 70 79 5f 69 6e 66 6f 5d 20 3d 3d 20 30  $copy_info] == 0
ea60: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
ea70: 20 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64        dict set d
ea80: 20 69 64 73 20 24 69 64 20 62 62 6f 78 4c 20 5b   ids $id bboxL [
ea90: 6c 69 73 74 20 24 78 30 20 24 79 30 20 24 4c 20  list $x0 $y0 $L 
eaa0: 24 4c 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  $L]..           
eab0: 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20       dict set d 
eac0: 69 64 73 20 24 69 64 20 61 6e 67 6c 65 20 24 61  ids $id angle $a
ead0: 6e 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ngle..          
eae0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
eaf0: 20 20 20 20 20 20 20 20 6c 61 62 65 6c 20 2d 20          label - 
eb00: 64 69 6d 65 6e 73 69 6f 6e 20 2d 20 74 65 78 74  dimension - text
eb10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
eb20: 73 65 74 20 74 65 78 74 20 5b 67 69 76 65 5f 70  set text [give_p
eb30: 72 6f 70 44 20 24 64 20 24 69 64 20 74 65 78 74  ropD $d $id text
eb40: 20 22 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   ""]..          
eb50: 20 20 69 66 20 7b 20 5b 72 65 67 65 78 70 20 7b    if { [regexp {
eb60: 66 6f 6e 74 2d 66 61 6d 69 6c 79 5c 73 2a 3a 5c  font-family\s*:\
eb70: 73 2a 28 2e 2b 29 7d 20 24 73 74 79 6c 65 20 7b  s*(.+)} $style {
eb80: 7d 20 66 6f 6e 74 5f 66 61 6d 69 6c 79 5d 20 7d  } font_family] }
eb90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
eba0: 20 20 20 20 73 65 74 20 66 6f 6e 74 5f 66 61 6d      set font_fam
ebb0: 69 6c 79 20 5b 6c 69 6e 64 65 78 20 5b 73 70 6c  ily [lindex [spl
ebc0: 69 74 20 24 66 6f 6e 74 5f 66 61 6d 69 6c 79 20  it $font_family 
ebd0: 2c 5d 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 20  ,] 0]..         
ebe0: 20 20 20 20 20 20 20 73 65 74 20 66 6f 6e 74 5f         set font_
ebf0: 66 61 6d 69 6c 79 20 5b 73 74 72 69 6e 67 20 74  family [string t
ec00: 72 69 6d 20 24 66 6f 6e 74 5f 66 61 6d 69 6c 79  rim $font_family
ec10: 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \"]..          
ec20: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
ec40: 66 6f 6e 74 5f 66 61 6d 69 6c 79 20 56 65 72 64  font_family Verd
ec50: 61 6e 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ana..           
ec60: 20 20 20 20 20 61 70 70 65 6e 64 20 73 74 79 6c       append styl
ec70: 65 20 22 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20  e "font-family: 
ec80: 56 65 72 64 61 6e 61 3b 73 61 6e 73 2d 73 65 72  Verdana;sans-ser
ec90: 69 66 3b 22 0d 0a 20 20 20 20 20 20 20 20 20 20  if;"..          
eca0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
ecb0: 20 69 66 20 7b 20 21 5b 72 65 67 65 78 70 20 7b   if { ![regexp {
ecc0: 66 6f 6e 74 2d 73 69 7a 65 5c 73 2a 3a 5c 73 2a  font-size\s*:\s*
ecd0: 28 5c 64 2b 29 7d 20 24 73 74 79 6c 65 20 7b 7d  (\d+)} $style {}
ece0: 20 66 6f 6e 74 5f 73 69 7a 65 5d 20 7d 20 7b 0d   font_size] } {.
ecf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ed00: 20 73 65 74 20 66 6f 6e 74 5f 73 69 7a 65 20 31   set font_size 1
ed10: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
ed20: 20 20 20 61 70 70 65 6e 64 20 73 74 79 6c 65 20     append style 
ed30: 22 66 6f 6e 74 2d 73 69 7a 65 3a 20 31 34 70 78  "font-size: 14px
ed40: 3b 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ;"..            
ed50: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 0d  }..            .
ed60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
ed70: 20 65 72 72 20 5b 63 61 74 63 68 20 7b 0d 0a 20   err [catch {.. 
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 6c 6f 61 64 20 7b 43 3a 5c 55 73 65 72     load {C:\User
eda0: 73 5c 72 61 6d 73 61 6e 5c 44 6f 63 75 6d 65 6e  s\ramsan\Documen
edb0: 74 73 5c 6d 79 54 63 6c 54 6b 5c 52 61 6d 44 65  ts\myTclTk\RamDe
edc0: 62 75 67 67 65 72 5c 75 74 69 6c 73 5c 74 65 73  bugger\utils\tes
edd0: 74 5f 6d 61 72 6b 64 6f 77 6e 5c 6d 61 72 6b 64  t_markdown\markd
ede0: 6f 77 6e 4c 69 62 2e 64 6c 6c 7d 20 6d 61 72 6b  ownLib.dll} mark
edf0: 64 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  down..          
ee00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65            set te
ee10: 78 74 5f 62 6f 78 20 5b 6d 65 61 73 75 72 65 5f  xt_box [measure_
ee20: 74 65 78 74 20 24 74 65 78 74 20 24 66 6f 6e 74  text $text $font
ee30: 5f 66 61 6d 69 6c 79 20 24 66 6f 6e 74 5f 73 69  _family $font_si
ee40: 7a 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ze]..           
ee50: 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 20       }]..       
ee60: 20 20 20 20 20 69 66 20 7b 20 24 65 72 72 20 7d       if { $err }
ee70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
ee80: 20 20 20 20 73 65 74 20 74 65 78 74 5f 62 6f 78      set text_box
ee90: 20 5b 6c 69 73 74 20 30 20 5b 65 78 70 72 20 7b   [list 0 [expr {
eea0: 2d 30 2e 32 2a 24 66 6f 6e 74 5f 73 69 7a 65 7d  -0.2*$font_size}
eeb0: 5d 20 5b 65 78 70 72 20 7b 30 2e 35 2a 5b 73 74  ] [expr {0.5*[st
eec0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 65 78  ring length $tex
eed0: 74 5d 2a 24 66 6f 6e 74 5f 73 69 7a 65 7d 5d 20  t]*$font_size}] 
eee0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
eef0: 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
ef00: 20 7b 30 2e 38 35 2a 24 66 6f 6e 74 5f 73 69 7a   {0.85*$font_siz
ef10: 65 7d 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  e}]]..          
ef20: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20               .. 
ef40: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
ef50: 70 6f 73 20 5b 6c 73 65 61 72 63 68 20 2d 69 6e  pos [lsearch -in
ef60: 64 65 78 20 30 20 24 70 6e 74 73 20 64 65 6c 74  dex 0 $pnts delt
ef70: 61 2d 70 6f 69 6e 74 5d 0d 0a 20 20 20 20 20 20  a-point]..      
ef80: 20 20 20 20 20 20 69 66 20 7b 20 24 69 70 6f 73        if { $ipos
ef90: 20 21 3d 20 2d 31 20 7d 20 7b 0d 0a 20 20 20 20   != -1 } {..    
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
efb0: 64 65 6c 74 61 20 5b 6c 72 61 6e 67 65 20 5b 6c  delta [lrange [l
efc0: 69 6e 64 65 78 20 24 70 6e 74 73 20 24 69 70 6f  index $pnts $ipo
efd0: 73 5d 20 31 20 32 5d 0d 0a 20 20 20 20 20 20 20  s] 1 2]..       
efe0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f000: 65 74 20 64 65 6c 74 61 20 22 22 0d 0a 20 20 20  et delta ""..   
f010: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f020: 20 20 20 20 20 20 20 20 69 66 20 7b 20 24 63 6d          if { $cm
f030: 64 20 65 71 20 22 64 69 6d 65 6e 73 69 6f 6e 22  d eq "dimension"
f040: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
f050: 20 20 20 20 20 20 73 65 74 20 70 61 72 65 6e 74        set parent
f060: 20 5b 63 61 6c 63 75 6c 61 74 65 5f 70 61 72 65   [calculate_pare
f070: 6e 74 20 24 69 64 5d 0d 0a 20 20 20 20 20 20 20  nt $id]..       
f080: 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6d 64           set cmd
f090: 50 20 5b 64 69 63 74 5f 67 65 74 64 20 24 64 20  P [dict_getd $d 
f0a0: 69 64 73 20 24 70 61 72 65 6e 74 20 63 6d 64 20  ids $parent cmd 
f0b0: 22 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ""]..           
f0c0: 20 20 20 20 20 73 65 74 20 68 76 20 5b 67 69 76       set hv [giv
f0d0: 65 5f 70 72 6f 70 44 20 24 64 20 24 69 64 20 68  e_propD $d $id h
f0e0: 6f 72 69 7a 6f 6e 74 61 6c 2d 76 65 72 74 69 63  orizontal-vertic
f0f0: 61 6c 20 22 22 5d 0d 0a 20 20 20 20 20 20 20 20  al ""]..        
f100: 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 6c          if { [ll
f110: 65 6e 67 74 68 20 24 70 6e 74 73 42 42 4f 58 5d  ength $pntsBBOX]
f120: 20 3e 3d 20 32 20 7d 20 7b 0d 0a 20 20 20 20 20   >= 2 } {..     
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f140: 65 74 20 70 30 20 5b 6c 69 6e 64 65 78 20 24 70  et p0 [lindex $p
f150: 6e 74 73 42 42 4f 58 20 30 5d 0d 0a 20 20 20 20  ntsBBOX 0]..    
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 73 65 74 20 76 54 20 5b 6d 3a 3a 73 75 62 20 5b  set vT [m::sub [
f180: 6c 69 6e 64 65 78 20 24 70 6e 74 73 42 42 4f 58  lindex $pntsBBOX
f190: 20 31 5d 20 24 70 30 5d 0d 0a 20 20 20 20 20 20   1] $p0]..      
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
f1b0: 74 20 76 4e 20 5b 6d 3a 3a 75 6e 69 74 4c 65 6e  t vN [m::unitLen
f1c0: 67 74 68 56 65 63 74 6f 72 20 22 5b 65 78 70 72  gthVector "[expr
f1d0: 20 7b 2d 31 2a 5b 6c 69 6e 64 65 78 20 24 76 54   {-1*[lindex $vT
f1e0: 20 31 5d 7d 5d 20 5b 6c 69 6e 64 65 78 20 24 76   1]}] [lindex $v
f1f0: 54 20 30 5d 22 5d 0d 0a 20 20 20 20 20 20 20 20  T 0]"]..        
f200: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
f210: 20 24 68 76 20 65 71 20 22 76 22 20 7d 20 7b 0d   $hv eq "v" } {.
f220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f230: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 4e 20           set vN 
f240: 5b 6d 3a 3a 73 63 61 6c 65 20 24 61 6e 63 68 6f  [m::scale $ancho
f250: 72 58 20 22 31 20 30 22 5d 0d 0a 20 20 20 20 20  rX "1 0"]..     
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
f270: 20 65 6c 73 65 69 66 20 7b 20 24 68 76 20 65 71   elseif { $hv eq
f280: 20 22 68 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20   "h" } {..      
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 20 20 73 65 74 20 76 4e 20 5b 6d 3a 3a 73 63 61    set vN [m::sca
f2b0: 6c 65 20 24 61 6e 63 68 6f 72 59 20 22 30 20 31  le $anchorY "0 1
f2c0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
f2d0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f2e0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
f2f0: 65 69 66 20 7b 20 24 63 6d 64 50 20 65 71 20 22  eif { $cmdP eq "
f300: 72 65 63 74 22 20 7d 20 7b 0d 0a 20 20 20 20 20  rect" } {..     
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f320: 65 74 20 62 20 5b 64 69 63 74 20 67 65 74 20 24  et b [dict get $
f330: 64 20 69 64 73 20 24 70 61 72 65 6e 74 20 62 62  d ids $parent bb
f340: 6f 78 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ox]..           
f350: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 30 20           set p0 
f360: 5b 6c 72 61 6e 67 65 20 24 62 20 30 20 31 5d 0d  [lrange $b 0 1].
f370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f380: 20 20 20 20 20 73 65 74 20 76 54 20 22 5b 6c 69       set vT "[li
f390: 6e 64 65 78 20 24 62 20 32 5d 20 30 22 0d 0a 20  ndex $b 2] 0".. 
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3b0: 20 20 20 73 65 74 20 76 4e 20 22 30 20 24 61 6e     set vN "0 $an
f3c0: 63 68 6f 72 59 22 0d 0a 20 20 20 20 20 20 20 20  chorY"..        
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
f3e0: 61 72 69 73 74 65 20 5b 67 69 76 65 5f 70 72 6f  ariste [give_pro
f3f0: 70 44 20 24 64 20 24 69 64 20 61 72 69 73 74 65  pD $d $id ariste
f400: 20 22 73 22 5d 0d 0a 20 20 20 20 20 20 20 20 20   "s"]..         
f410: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
f420: 68 20 24 61 72 69 73 74 65 20 7b 0d 0a 20 20 20  h $ariste {..   
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 20 73 20 7b 0d 0a 20 20 20 20 20 20       s {..      
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 20 20 20 20 73 65 74 20 70 30 20 5b 6d 3a        set p0 [m:
f470: 3a 61 64 64 20 24 70 30 20 22 30 20 5b 6c 69 6e  :add $p0 "0 [lin
f480: 64 65 78 20 24 62 20 33 5d 22 5d 20 0d 0a 20 20  dex $b 3]"] ..  
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4c0: 20 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   w {..          
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 73 65 74 20 76 54 20 22 30 20 5b 6c 69 6e    set vT "0 [lin
f4f0: 64 65 78 20 24 62 20 33 5d 22 20 3b 20 73 65 74  dex $b 3]" ; set
f500: 20 76 4e 20 22 24 61 6e 63 68 6f 72 58 20 30 22   vN "$anchorX 0"
f510: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f520: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 20 65 20 7b 0d 0a 20 20 20 20 20 20       e {..      
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 20 20 20 73 65 74 20 70 30 20 5b 6d 3a        set p0 [m:
f570: 3a 61 64 64 20 24 70 30 20 22 5b 6c 69 6e 64 65  :add $p0 "[linde
f580: 78 20 24 62 20 32 5d 20 30 22 5d 0d 0a 20 20 20  x $b 2] 0"]..   
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 54 20           set vT 
f5b0: 22 30 20 5b 6c 69 6e 64 65 78 20 24 62 20 33 5d  "0 [lindex $b 3]
f5c0: 22 20 3b 20 73 65 74 20 76 4e 20 22 24 61 6e 63  " ; set vN "$anc
f5d0: 68 6f 72 58 20 30 22 0d 0a 20 20 20 20 20 20 20  horX 0"..       
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
f600: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
f610: 20 20 20 20 20 20 20 20 20 20 20 7d 20 20 20 20             }    
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20     ..           
f640: 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20       ..         
f650: 20 20 20 20 20 20 20 73 65 74 20 70 31 20 5b 6d         set p1 [m
f660: 3a 3a 61 64 64 20 24 70 30 20 24 76 54 5d 0d 0a  ::add $p0 $vT]..
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f690: 20 20 69 66 20 7b 20 24 68 76 20 65 71 20 22 68    if { $hv eq "h
f6a0: 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  " } {..         
f6b0: 20 20 20 20 20 20 20 20 20 20 20 6c 73 65 74 20             lset 
f6c0: 76 54 20 31 20 30 0d 0a 20 20 20 20 20 20 20 20  vT 1 0..        
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
f6e0: 76 63 20 5b 6c 69 6e 64 65 78 20 24 76 4e 20 31  vc [lindex $vN 1
f6f0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
f700: 20 20 20 20 20 20 20 69 66 20 7b 20 24 76 63 20         if { $vc 
f710: 21 3d 20 30 20 7d 20 7b 0d 0a 20 20 20 20 20 20  != 0 } {..      
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 73 65 74 20 76 4e 20 22 30 20 5b 65 78 70    set vN "0 [exp
f740: 72 20 7b 24 76 63 2f 61 62 73 28 24 76 63 29 7d  r {$vc/abs($vc)}
f750: 5d 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ]"              
f760: 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20 20             ..   
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
f790: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24      } elseif { $
f7a0: 68 76 20 65 71 20 22 76 22 20 7d 20 7b 0d 0a 20  hv eq "v" } {.. 
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 6c 73 65 74 20 76 54 20 30 20 30 0d 0a     lset vT 0 0..
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 73 65 74 20 76 63 20 5b 6c 69 6e 64      set vc [lind
f7f0: 65 78 20 24 76 4e 20 30 5d 0d 0a 20 20 20 20 20  ex $vN 0]..     
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
f810: 66 20 7b 20 24 76 63 20 21 3d 20 30 20 7d 20 7b  f { $vc != 0 } {
f820: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f830: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 4e            set vN
f840: 20 22 5b 65 78 70 72 20 7b 24 76 63 2f 61 62 73   "[expr {$vc/abs
f850: 28 24 76 63 29 7d 5d 20 30 22 0d 0a 20 20 20 20  ($vc)}] 0"..    
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
f880: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
f890: 20 20 20 20 20 20 73 65 74 20 66 61 63 20 5b 65        set fac [e
f8a0: 78 70 72 20 7b 30 2e 38 2a 24 66 6f 6e 74 5f 73  xpr {0.8*$font_s
f8b0: 69 7a 65 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ize}]..         
f8c0: 20 20 20 20 20 20 20 73 65 74 20 76 4e 20 5b 6d         set vN [m
f8d0: 3a 3a 73 63 61 6c 65 20 24 66 61 63 20 24 76 4e  ::scale $fac $vN
f8e0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
f8f0: 20 20 20 69 66 20 7b 20 24 64 65 6c 74 61 20 65     if { $delta e
f900: 71 20 22 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20  q "" } {..      
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
f920: 74 20 76 4e 64 20 24 76 4e 0d 0a 20 20 20 20 20  t vNd $vN..     
f930: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
f940: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
f950: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 4e 64           set vNd
f960: 20 24 64 65 6c 74 61 0d 0a 20 20 20 20 20 20 20   $delta..       
f970: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
f980: 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20              ..  
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
f9a0: 74 20 70 30 44 31 20 5b 6d 3a 3a 61 78 70 79 20  t p0D1 [m::axpy 
f9b0: 31 20 24 76 4e 64 20 24 70 30 5d 0d 0a 20 20 20  1 $vNd $p0]..   
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
f9d0: 20 70 31 44 31 20 5b 6d 3a 3a 61 78 70 79 20 31   p1D1 [m::axpy 1
f9e0: 20 24 76 4e 64 20 24 70 31 5d 0d 0a 20 20 20 20   $vNd $p1]..    
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20              ..  
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
fa10: 74 20 70 30 44 32 20 5b 6d 3a 3a 61 78 70 79 20  t p0D2 [m::axpy 
fa20: 31 20 24 76 4e 20 24 70 30 44 31 5d 0d 0a 20 20  1 $vN $p0D1]..  
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
fa40: 74 20 70 31 44 32 20 5b 6d 3a 3a 61 78 70 79 20  t p1D2 [m::axpy 
fa50: 31 20 24 76 4e 20 24 70 31 44 31 5d 0d 0a 20 20  1 $vN $p1D1]..  
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a                ..
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 69 66 20 7b 20 24 68 76 20 65 71 20 22 68 22 20  if { $hv eq "h" 
fa90: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
faa0: 20 20 20 20 20 20 20 20 20 6c 73 65 74 20 70 31           lset p1
fab0: 44 31 20 31 20 5b 6c 69 6e 64 65 78 20 24 70 30  D1 1 [lindex $p0
fac0: 44 31 20 31 5d 0d 0a 20 20 20 20 20 20 20 20 20  D1 1]..         
fad0: 20 20 20 20 20 20 20 20 20 20 20 6c 73 65 74 20             lset 
fae0: 70 31 44 32 20 31 20 5b 6c 69 6e 64 65 78 20 24  p1D2 1 [lindex $
faf0: 70 30 44 32 20 31 5d 0d 0a 20 20 20 20 20 20 20  p0D2 1]..       
fb00: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
fb10: 66 20 7b 20 24 68 76 20 65 71 20 22 76 22 20 7d  f { $hv eq "v" }
fb20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
fb30: 20 20 20 20 20 20 20 20 6c 73 65 74 20 70 31 44          lset p1D
fb40: 31 20 30 20 5b 6c 69 6e 64 65 78 20 24 70 30 44  1 0 [lindex $p0D
fb50: 31 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  1 0]..          
fb60: 20 20 20 20 20 20 20 20 20 20 6c 73 65 74 20 70            lset p
fb70: 31 44 32 20 30 20 5b 6c 69 6e 64 65 78 20 24 70  1D2 0 [lindex $p
fb80: 30 44 32 20 30 5d 0d 0a 20 20 20 20 20 20 20 20  0D2 0]..        
fb90: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
fba0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
fbb0: 4c 61 62 65 6c 20 5b 6d 3a 3a 73 63 61 6c 65 20  Label [m::scale 
fbc0: 30 2e 35 20 5b 6d 3a 3a 61 64 64 20 24 70 30 44  0.5 [m::add $p0D
fbd0: 31 20 24 70 31 44 31 5d 5d 0d 0a 20 20 20 20 20  1 $p1D1]]..     
fbe0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
fbf0: 4c 61 62 65 6c 20 5b 6d 3a 3a 61 78 70 79 20 30  Label [m::axpy 0
fc00: 2e 37 20 24 76 4e 20 24 70 4c 61 62 65 6c 5d 0d  .7 $vN $pLabel].
fc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
fc20: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
fc30: 20 20 20 20 20 20 20 73 65 74 20 70 4c 61 62 65         set pLabe
fc40: 6c 20 5b 6c 72 61 6e 67 65 20 24 62 62 6f 78 20  l [lrange $bbox 
fc50: 30 20 31 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  0 1]..          
fc60: 20 20 20 20 20 20 73 65 74 20 76 4e 20 22 24 61        set vN "$a
fc70: 6e 63 68 6f 72 58 20 24 61 6e 63 68 6f 72 59 22  nchorX $anchorY"
fc80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
fc90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
fca0: 7b 20 24 63 6d 64 20 65 71 20 22 64 69 6d 65 6e  { $cmd eq "dimen
fcb0: 73 69 6f 6e 22 20 7d 20 7b 20 20 20 20 20 20 20  sion" } {       
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ..             
fce0: 20 20 20 73 65 74 20 73 74 20 22 73 74 72 6f 6b     set st "strok
fcf0: 65 3a 62 6c 61 63 6b 3b 73 74 72 6f 6b 65 2d 77  e:black;stroke-w
fd00: 69 64 74 68 3a 31 70 78 3b 24 73 74 79 6c 65 22  idth:1px;$style"
fd10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fd20: 20 20 61 70 70 65 6e 64 20 78 6d 6c 20 22 3c 70    append xml "<p
fd30: 61 74 68 20 64 3d 27 4d 24 70 30 20 4c 24 70 30  ath d='M$p0 L$p0
fd40: 44 32 27 20 69 64 3d 27 24 69 64 2d 44 4c 31 27  D2' id='$id-DL1'
fd50: 20 73 74 79 6c 65 3d 27 24 73 74 27 2f 3e 5c 6e   style='$st'/>\n
fd60: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  "..             
fd70: 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20 22 3c     append xml "<
fd80: 70 61 74 68 20 64 3d 27 4d 24 70 31 20 4c 24 70  path d='M$p1 L$p
fd90: 31 44 32 27 20 69 64 3d 27 24 69 64 2d 44 4c 32  1D2' id='$id-DL2
fda0: 27 20 73 74 79 6c 65 3d 27 24 73 74 27 2f 3e 5c  ' style='$st'/>\
fdb0: 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n"..            
fdc0: 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20 20      ..          
fdd0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 73 74 20        append st 
fde0: 22 6d 61 72 6b 65 72 2d 65 6e 64 3a 75 72 6c 28  "marker-end:url(
fdf0: 23 54 72 69 61 6e 67 6c 65 4f 75 74 4c 29 3b 22  #TriangleOutL);"
fe00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
fe10: 20 20 20 20 20 20 20 20 22 6d 61 72 6b 65 72 2d          "marker-
fe20: 73 74 61 72 74 3a 75 72 6c 28 23 54 72 69 61 6e  start:url(#Trian
fe30: 67 6c 65 49 6e 4c 29 3b 22 0d 0a 20 20 20 20 20  gleInL);"..     
fe40: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
fe50: 64 20 78 6d 6c 20 22 3c 70 61 74 68 20 64 3d 27  d xml "<path d='
fe60: 4d 24 70 30 44 31 20 4c 24 70 31 44 31 27 20 69  M$p0D1 L$p1D1' i
fe70: 64 3d 27 24 69 64 2d 44 4c 27 20 73 74 79 6c 65  d='$id-DL' style
fe80: 3d 27 24 73 74 27 2f 3e 5c 6e 22 0d 0a 20 20 20  ='$st'/>\n"..   
fe90: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
fea0: 66 20 7b 20 24 64 65 6c 74 61 20 6e 65 20 22 22  f { $delta ne ""
feb0: 20 26 26 20 5b 6d 3a 3a 6e 6f 72 6d 5f 74 77 6f   && [m::norm_two
fec0: 20 24 64 65 6c 74 61 5d 20 3e 20 32 30 20 7d 20   $delta] > 20 } 
fed0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
fee0: 20 20 20 73 65 74 20 70 30 44 20 5b 6d 3a 3a 61     set p0D [m::a
fef0: 64 64 20 24 70 4c 61 62 65 6c 20 24 64 65 6c 74  dd $pLabel $delt
ff00: 61 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  a]..            
ff10: 20 20 20 20 73 65 74 20 70 31 44 20 5b 6d 3a 3a      set p1D [m::
ff20: 61 78 70 79 20 30 2e 31 20 24 64 65 6c 74 61 20  axpy 0.1 $delta 
ff30: 24 70 4c 61 62 65 6c 5d 0d 0a 20 20 20 20 20 20  $pLabel]..      
ff40: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 65            set de
ff50: 6c 74 61 20 22 22 0d 0a 20 20 20 20 20 20 20 20  lta ""..        
ff60: 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20          ..      
ff70: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 74            set st
ff80: 20 22 73 74 72 6f 6b 65 3a 62 6c 61 63 6b 3b 73   "stroke:black;s
ff90: 74 72 6f 6b 65 2d 77 69 64 74 68 3a 31 70 78 3b  troke-width:1px;
ffa0: 24 73 74 79 6c 65 22 0d 0a 20 20 20 20 20 20 20  $style"..       
ffb0: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
ffc0: 73 74 20 22 6d 61 72 6b 65 72 2d 65 6e 64 3a 75  st "marker-end:u
ffd0: 72 6c 28 23 54 72 69 61 6e 67 6c 65 4f 75 74 4c  rl(#TriangleOutL
ffe0: 29 3b 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20  );"..           
fff0: 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d 6c 20       append xml 
10000 22 3c 70 61 74 68 20 64 3d 27 4d 24 70 30 44 20  "<path d='M$p0D 
10010 4c 24 70 31 44 27 20 69 64 3d 27 24 69 64 2d 44  L$p1D' id='$id-D
10020 4c 27 20 73 74 79 6c 65 3d 27 24 73 74 27 2f 3e  L' style='$st'/>
10030 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n"..           
10040 20 20 20 20 20 73 65 74 20 70 4c 61 62 65 6c 20       set pLabel 
10050 24 70 30 44 0d 0a 20 20 20 20 20 20 20 20 20 20  $p0D..          
10060 20 20 20 20 20 20 73 65 74 20 63 6d 64 20 6c 61        set cmd la
10070 62 65 6c 61 72 72 6f 77 0d 0a 20 20 20 20 20 20  belarrow..      
10080 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10090 20 20 20 20 20 0d 0a 23 20 20 20 20 20 20 20 20       ..#        
100a0 20 20 20 20 20 69 66 20 7b 20 24 63 6d 64 20 65       if { $cmd e
100b0 71 20 22 74 65 78 74 22 20 7d 20 7b 0d 0a 23 20  q "text" } {..# 
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 73 65 74 20 66 73 58 20 22 30 20 30 20 30 22 0d  set fsX "0 0 0".
100e0 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
100f0 20 20 20 73 65 74 20 66 73 59 20 22 30 20 30 20     set fsY "0 0 
10100 30 2e 38 22 0d 0a 23 20 20 20 20 20 20 20 20 20  0.8"..#         
10110 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24      } elseif { $
10120 63 6d 64 20 65 71 20 22 6c 61 62 65 6c 61 72 72  cmd eq "labelarr
10130 6f 77 22 20 7d 20 7b 0d 0a 23 20 20 20 20 20 20  ow" } {..#      
10140 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66             set f
10150 73 58 20 22 30 20 30 20 30 22 0d 0a 23 20 20 20  sX "0 0 0"..#   
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
10170 74 20 66 73 59 20 22 2d 30 2e 32 20 30 2e 30 20  t fsY "-0.2 0.0 
10180 31 22 0d 0a 23 20 20 20 20 20 20 20 20 20 20 20  1"..#           
10190 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 23 20 20 20    } else {..#   
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
101b0 74 20 66 73 58 20 22 2d 30 2e 33 20 30 20 30 2e  t fsX "-0.3 0 0.
101c0 33 22 0d 0a 23 20 20 20 20 20 20 20 20 20 20 20  3"..#           
101d0 20 20 20 20 20 20 73 65 74 20 66 73 59 20 22 2d        set fsY "-
101e0 30 2e 35 20 30 2e 32 20 31 22 0d 0a 23 20 20 20  0.5 0.2 1"..#   
101f0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 23 20 20            }..#  
10200 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
10210 20 7b 0d 0a 23 20 20 20 20 20 20 20 20 20 20 20   {..#           
10220 20 20 20 20 20 20 73 65 74 20 76 4e 20 5b 6d 3a        set vN [m:
10230 3a 75 6e 69 74 4c 65 6e 67 74 68 56 65 63 74 6f  :unitLengthVecto
10240 72 20 24 76 4e 5d 0d 0a 23 20 20 20 20 20 20 20  r $vN]..#       
10250 20 20 20 20 20 20 7d 0d 0a 23 20 20 20 20 20 20        }..#      
10260 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 22         lassign "
10270 30 20 30 22 20 66 61 63 31 20 66 61 63 32 0d 0a  0 0" fac1 fac2..
10280 23 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66  #             if
10290 20 7b 20 61 62 73 28 5b 6c 69 6e 64 65 78 20 24   { abs([lindex $
102a0 76 4e 20 30 5d 29 3e 30 2e 32 20 7d 20 7b 0d 0a  vN 0])>0.2 } {..
102b0 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  #               
102c0 20 20 73 65 74 20 66 61 63 31 20 5b 65 78 70 72    set fac1 [expr
102d0 20 7b 61 62 73 28 5b 6c 69 6e 64 65 78 20 24 66   {abs([lindex $f
102e0 73 58 20 24 61 6e 63 68 6f 72 58 2b 31 5d 2a 24  sX $anchorX+1]*$
102f0 66 6f 6e 74 5f 73 69 7a 65 29 7d 5d 0d 0a 23 20  font_size)}]..# 
10300 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 23              }..#
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
10320 7b 20 61 62 73 28 5b 6c 69 6e 64 65 78 20 24 76  { abs([lindex $v
10330 4e 20 31 5d 29 3e 30 2e 32 20 7d 20 7b 0d 0a 23  N 1])>0.2 } {..#
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 73 65 74 20 66 61 63 32 20 5b 65 78 70 72 20   set fac2 [expr 
10360 7b 61 62 73 28 5b 6c 69 6e 64 65 78 20 24 66 73  {abs([lindex $fs
10370 59 20 24 61 6e 63 68 6f 72 59 2b 31 5d 2a 24 66  Y $anchorY+1]*$f
10380 6f 6e 74 5f 73 69 7a 65 29 7d 5d 0d 0a 23 20 20  ont_size)}]..#  
10390 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 23 20             }..# 
103a0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
103b0 66 61 63 20 5b 65 78 70 72 20 7b 28 24 66 61 63  fac [expr {($fac
103c0 31 3e 24 66 61 63 32 29 3f 24 66 61 63 31 3a 24  1>$fac2)?$fac1:$
103d0 66 61 63 32 7d 5d 0d 0a 23 20 20 20 20 20 20 20  fac2}]..#       
103e0 20 20 20 20 20 20 73 65 74 20 70 4c 61 62 65 6c        set pLabel
103f0 20 5b 6d 3a 3a 61 78 70 79 20 24 66 61 63 20 24   [m::axpy $fac $
10400 76 4e 20 24 70 4c 61 62 65 6c 5d 0d 0a 20 20 20  vN $pLabel]..   
10410 20 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20           ..     
10420 20 20 20 20 20 20 20 69 66 20 7b 20 24 61 6e 63         if { $anc
10430 68 6f 72 59 20 3d 3d 20 31 20 7d 20 7b 0d 0a 20  horY == 1 } {.. 
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
10450 73 65 74 20 70 4c 61 62 65 6c 20 31 20 5b 65 78  set pLabel 1 [ex
10460 70 72 20 7b 5b 6c 69 6e 64 65 78 20 24 70 4c 61  pr {[lindex $pLa
10470 62 65 6c 20 31 5d 2b 28 5b 6c 69 6e 64 65 78 20  bel 1]+([lindex 
10480 24 74 65 78 74 5f 62 6f 78 20 31 5d 2b 5b 6c 69  $text_box 1]+[li
10490 6e 64 65 78 20 24 74 65 78 74 5f 62 6f 78 20 33  ndex $text_box 3
104a0 5d 29 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ])}]..          
104b0 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24 61 6e    } elseif { $an
104c0 63 68 6f 72 59 20 3d 3d 20 2d 31 20 7d 20 7b 0d  chorY == -1 } {.
104d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
104e0 20 6c 73 65 74 20 70 4c 61 62 65 6c 20 31 20 5b   lset pLabel 1 [
104f0 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20 24 70  expr {[lindex $p
10500 4c 61 62 65 6c 20 31 5d 2b 5b 6c 69 6e 64 65 78  Label 1]+[lindex
10510 20 24 74 65 78 74 5f 62 6f 78 20 31 5d 7d 5d 0d   $text_box 1]}].
10520 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
10530 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20              ..  
10540 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24            if { $
10550 64 65 6c 74 61 20 6e 65 20 22 22 20 26 26 20 24  delta ne "" && $
10560 63 6d 64 20 6e 65 20 22 64 69 6d 65 6e 73 69 6f  cmd ne "dimensio
10570 6e 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  n" } {..        
10580 20 20 20 20 20 20 20 20 73 65 74 20 70 4c 61 62          set pLab
10590 65 6c 20 5b 6d 3a 3a 61 64 64 20 24 70 4c 61 62  el [m::add $pLab
105a0 65 6c 20 24 64 65 6c 74 61 5d 0d 0a 20 20 20 20  el $delta]..    
105b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
105c0 20 7b 20 24 63 6d 64 20 65 71 20 22 6c 61 62 65   { $cmd eq "labe
105d0 6c 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  l" } {..        
105e0 20 20 20 20 20 20 20 20 6c 73 65 74 20 70 4c 61          lset pLa
105f0 62 65 6c 20 30 20 5b 65 78 70 72 20 7b 5b 6c 69  bel 0 [expr {[li
10600 6e 64 65 78 20 24 70 4c 61 62 65 6c 20 30 5d 2b  ndex $pLabel 0]+
10610 30 2e 35 2a 24 61 6e 63 68 6f 72 58 2a 24 66 6f  0.5*$anchorX*$fo
10620 6e 74 5f 73 69 7a 65 7d 5d 0d 0a 20 20 20 20 20  nt_size}]..     
10630 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10640 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20        ..        
10650 20 20 20 20 69 66 20 7b 20 24 61 6e 63 68 6f 72      if { $anchor
10660 58 20 3d 3d 20 2d 31 20 7d 20 7b 0d 0a 20 20 20  X == -1 } {..   
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
10680 20 74 61 20 22 65 6e 64 22 0d 0a 20 20 20 20 20   ta "end"..     
10690 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
106a0 7b 20 24 61 6e 63 68 6f 72 58 20 3d 3d 20 31 20  { $anchorX == 1 
106b0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
106c0 20 20 20 20 20 73 65 74 20 74 61 20 22 73 74 61       set ta "sta
106d0 72 74 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rt"..           
106e0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
106f0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74             set t
10700 61 20 22 6d 69 64 64 6c 65 22 0d 0a 20 20 20 20  a "middle"..    
10710 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
10720 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20         ..       
10730 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 70 4c       lassign $pL
10740 61 62 65 6c 20 78 20 79 0d 0a 20 20 20 20 20 20  abel x y..      
10750 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20        ..        
10760 20 20 20 20 69 66 20 7b 20 5b 72 65 67 65 78 70      if { [regexp
10770 20 7b 62 6f 72 64 65 72 2d 73 74 72 6f 6b 65 2d   {border-stroke-
10780 77 69 64 74 68 3a 5c 73 2a 28 28 5c 64 2b 29 5b  width:\s*((\d+)[
10790 5e 3b 5d 2b 29 7d 20 24 73 74 79 6c 65 20 7b 7d  ^;]+)} $style {}
107a0 20 76 61 6c 75 65 20 6e 75 6d 5d 20 26 26 20 24   value num] && $
107b0 6e 75 6d 20 3e 20 30 20 7d 20 7b 0d 0a 20 20 20  num > 0 } {..   
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
107d0 7b 20 5b 72 65 67 65 78 70 20 7b 62 6f 72 64 65  { [regexp {borde
107e0 72 2d 73 74 72 6f 6b 65 3a 5c 73 2a 28 5b 5e 3b  r-stroke:\s*([^;
107f0 5d 2b 29 7d 20 24 73 74 79 6c 65 20 7b 7d 20 73  ]+)} $style {} s
10800 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ] } {..         
10810 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
10820 74 72 6f 6b 65 20 24 73 0d 0a 20 20 20 20 20 20  troke $s..      
10830 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
10840 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10850 20 20 20 20 20 20 20 20 73 65 74 20 73 74 72 6f          set stro
10860 6b 65 20 62 6c 61 63 6b 20 20 20 0d 0a 20 20 20  ke black   ..   
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 69 66 20 7b 20 5b 72 65 67 65 78 70 20 7b 70 61  if { [regexp {pa
108a0 64 64 69 6e 67 3a 5c 73 2a 28 28 5c 64 2b 29 5b  dding:\s*((\d+)[
108b0 5e 3b 5d 2b 29 7d 20 24 73 74 79 6c 65 20 7b 7d  ^;]+)} $style {}
108c0 20 70 61 64 64 69 6e 67 5d 20 3d 3d 20 30 20 7d   padding] == 0 }
108d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
108e0 20 20 20 20 20 20 20 20 73 65 74 20 70 61 64 64          set padd
108f0 69 6e 67 20 5b 65 78 70 72 20 7b 30 2e 35 2a 24  ing [expr {0.5*$
10900 66 6f 6e 74 5f 73 69 7a 65 7d 5d 0d 0a 20 20 20  font_size}]..   
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
10920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10930 6c 61 73 73 69 67 6e 20 24 70 4c 61 62 65 6c 20  lassign $pLabel 
10940 78 52 20 79 52 0d 0a 20 20 20 20 20 20 20 20 20  xR yR..         
10950 20 20 20 20 20 20 20 69 66 20 7b 20 24 61 6e 63         if { $anc
10960 68 6f 72 58 20 3d 3d 20 2d 31 20 7d 20 7b 0d 0a  horX == -1 } {..
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 20 20 20 73 65 74 20 78 52 20 5b 65 78 70 72      set xR [expr
10990 20 7b 24 78 52 2d 5b 6c 69 6e 64 65 78 20 24 74   {$xR-[lindex $t
109a0 65 78 74 5f 62 6f 78 20 32 5d 7d 5d 0d 0a 20 20  ext_box 2]}]..  
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
109c0 65 6c 73 65 69 66 20 7b 20 24 61 6e 63 68 6f 72  elseif { $anchor
109d0 58 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20 20 20  X == 0 } {..    
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 73 65 74 20 78 52 20 5b 65 78 70 72 20 7b 24 78  set xR [expr {$x
10a00 52 2d 30 2e 35 2a 5b 6c 69 6e 64 65 78 20 24 74  R-0.5*[lindex $t
10a10 65 78 74 5f 62 6f 78 20 32 5d 7d 5d 0d 0a 20 20  ext_box 2]}]..  
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
10a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10a40 20 73 65 74 20 78 52 20 5b 65 78 70 72 20 7b 24   set xR [expr {$
10a50 78 52 2d 24 70 61 64 64 69 6e 67 7d 5d 0d 0a 20  xR-$padding}].. 
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10a70 65 74 20 79 52 20 5b 65 78 70 72 20 7b 24 79 52  et yR [expr {$yR
10a80 2d 28 5b 6c 69 6e 64 65 78 20 24 74 65 78 74 5f  -([lindex $text_
10a90 62 6f 78 20 31 5d 2b 5b 6c 69 6e 64 65 78 20 24  box 1]+[lindex $
10aa0 74 65 78 74 5f 62 6f 78 20 33 5d 29 2d 24 70 61  text_box 3])-$pa
10ab0 64 64 69 6e 67 7d 5d 0d 0a 20 20 20 20 20 20 20  dding}]..       
10ac0 20 20 20 20 20 20 20 20 20 73 65 74 20 77 20 5b           set w [
10ad0 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20 24 74  expr {[lindex $t
10ae0 65 78 74 5f 62 6f 78 20 32 5d 2b 32 2a 24 70 61  ext_box 2]+2*$pa
10af0 64 64 69 6e 67 7d 5d 0d 0a 20 20 20 20 20 20 20  dding}]..       
10b00 20 20 20 20 20 20 20 20 20 73 65 74 20 68 20 5b           set h [
10b10 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20 24 74  expr {[lindex $t
10b20 65 78 74 5f 62 6f 78 20 33 5d 2b 32 2a 24 70 61  ext_box 3]+2*$pa
10b30 64 64 69 6e 67 7d 5d 0d 0a 20 20 20 20 20 20 20  dding}]..       
10b40 20 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20           ..     
10b50 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73             set s
10b60 74 79 6c 65 42 20 22 24 73 74 79 6c 65 3b 73 74  tyleB "$style;st
10b70 72 6f 6b 65 2d 77 69 64 74 68 3a 24 76 61 6c 75  roke-width:$valu
10b80 65 3b 73 74 72 6f 6b 65 3a 24 73 74 72 6f 6b 65  e;stroke:$stroke
10b90 3b 66 69 6c 6c 3a 6e 6f 6e 65 3b 22 0d 0a 20 20  ;fill:none;"..  
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
10bb0 70 65 6e 64 20 78 6d 6c 20 22 3c 72 65 63 74 20  pend xml "<rect 
10bc0 78 3d 27 24 78 52 27 20 79 3d 27 24 79 52 27 20  x='$xR' y='$yR' 
10bd0 77 69 64 74 68 3d 27 24 77 27 20 68 65 69 67 68  width='$w' heigh
10be0 74 3d 27 24 68 27 20 22 0d 0a 20 20 20 20 20 20  t='$h' "..      
10bf0 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
10c00 20 78 6d 6c 20 22 69 64 3d 27 24 69 64 2d 62 6f   xml "id='$id-bo
10c10 72 64 65 72 27 20 73 74 79 6c 65 3d 27 24 73 74  rder' style='$st
10c20 79 6c 65 42 27 22 0d 0a 20 20 20 20 20 20 20 20  yleB'"..        
10c30 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 72 65          if { [re
10c40 67 65 78 70 20 7b 62 6f 72 64 65 72 2d 72 61 64  gexp {border-rad
10c50 69 75 73 5c 73 2a 3a 5c 73 2a 28 5c 64 2b 29 7d  ius\s*:\s*(\d+)}
10c60 20 24 73 74 79 6c 65 20 7b 7d 20 72 5d 20 7d 20   $style {} r] } 
10c70 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
10c80 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 78 6d         append xm
10c90 6c 20 22 20 72 78 3d 27 24 72 27 20 72 79 3d 27  l " rx='$r' ry='
10ca0 24 72 27 22 0d 0a 20 20 20 20 20 20 20 20 20 20  $r'"..          
10cb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10cc0 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20           append 
10cd0 78 6d 6c 20 22 2f 3e 5c 6e 22 0d 0a 20 20 20 20  xml "/>\n"..    
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20 20              ..  
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
10d00 74 20 62 62 6f 78 20 5b 6c 69 73 74 20 24 78 52  t bbox [list $xR
10d10 20 24 79 52 20 24 77 20 24 68 5d 0d 0a 20 20 20   $yR $w $h]..   
10d20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
10d30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
10d40 20 20 20 73 65 74 20 77 20 5b 6c 69 6e 64 65 78     set w [lindex
10d50 20 24 74 65 78 74 5f 62 6f 78 20 32 5d 0d 0a 20   $text_box 2].. 
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10d70 65 74 20 68 20 5b 6c 69 6e 64 65 78 20 24 74 65  et h [lindex $te
10d80 78 74 5f 62 6f 78 20 33 5d 0d 0a 20 20 20 20 20  xt_box 3]..     
10d90 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 78             set x
10da0 42 20 24 78 0d 0a 20 20 20 20 20 20 20 20 20 20  B $x..          
10db0 20 20 20 20 20 20 69 66 20 7b 20 24 61 6e 63 68        if { $anch
10dc0 6f 72 58 20 3d 3d 20 2d 31 20 7d 20 7b 0d 0a 20  orX == -1 } {.. 
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 20 73 65 74 20 78 42 20 5b 65 78 70 72 20     set xB [expr 
10df0 7b 24 78 42 2d 5b 6c 69 6e 64 65 78 20 24 74 65  {$xB-[lindex $te
10e00 78 74 5f 62 6f 78 20 32 5d 7d 5d 0d 0a 20 20 20  xt_box 2]}]..   
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
10e20 6c 73 65 69 66 20 7b 20 24 61 6e 63 68 6f 72 58  lseif { $anchorX
10e30 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20 20 20 20   == 0 } {..     
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10e50 65 74 20 78 42 20 5b 65 78 70 72 20 7b 24 78 42  et xB [expr {$xB
10e60 2d 30 2e 35 2a 5b 6c 69 6e 64 65 78 20 24 74 65  -0.5*[lindex $te
10e70 78 74 5f 62 6f 78 20 32 5d 7d 5d 0d 0a 20 20 20  xt_box 2]}]..   
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 73 65 74 20 79 42 20 5b 65 78 70 72 20 7b 24 79  set yB [expr {$y
10eb0 2d 28 5b 6c 69 6e 64 65 78 20 24 74 65 78 74 5f  -([lindex $text_
10ec0 62 6f 78 20 31 5d 2b 5b 6c 69 6e 64 65 78 20 24  box 1]+[lindex $
10ed0 74 65 78 74 5f 62 6f 78 20 33 5d 29 7d 5d 0d 0a  text_box 3])}]..
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 73 65 74 20 62 62 6f 78 20 5b 6c 69 73 74 20 24  set bbox [list $
10f00 78 42 20 24 79 42 20 24 77 20 24 68 5d 20 0d 0a  xB $yB $w $h] ..
10f10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
10f20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20             if { 
10f30 5b 64 69 63 74 20 73 69 7a 65 20 24 63 6f 70 79  [dict size $copy
10f40 5f 69 6e 66 6f 5d 20 3d 3d 20 30 20 7d 20 7b 0d  _info] == 0 } {.
10f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f60 20 64 69 63 74 20 73 65 74 20 64 20 69 64 73 20   dict set d ids 
10f70 24 69 64 20 62 62 6f 78 20 24 62 62 6f 78 0d 0a  $id bbox $bbox..
10f80 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
10f90 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
10fa0 20 20 20 20 20 20 61 64 64 5f 74 6f 5f 62 62 6f        add_to_bbo
10fb0 78 20 5b 64 69 63 74 20 67 65 74 20 24 63 6f 70  x [dict get $cop
10fc0 79 5f 69 6e 66 6f 20 69 64 5d 20 24 62 62 6f 78  y_info id] $bbox
10fd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
10fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 0d 0a 20  .            .. 
10ff0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
11000 64 20 78 6d 6c 20 5b 66 6f 72 6d 61 74 20 22 3c  d xml [format "<
11010 74 65 78 74 20 78 3d 27 25 2e 33 67 27 20 79 3d  text x='%.3g' y=
11020 27 25 2e 33 67 27 20 74 65 78 74 2d 61 6e 63 68  '%.3g' text-anch
11030 6f 72 3d 27 25 73 27 20 69 64 3d 27 25 73 27 20  or='%s' id='%s' 
11040 73 74 79 6c 65 3d 27 25 73 27 3e 22 20 5c 0d 0a  style='%s'>" \..
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 78                $x
11060 20 24 79 20 24 74 61 20 24 69 64 20 24 73 74 79   $y $ta $id $sty
11070 6c 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le]..           
11080 20 61 70 70 65 6e 64 20 78 6d 6c 20 5b 61 70 70   append xml [app
11090 65 6e 64 5f 74 73 70 61 6e 73 20 24 78 20 24 74  end_tspans $x $t
110a0 65 78 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ext]..          
110b0 20 20 61 70 70 65 6e 64 20 78 6d 6c 20 22 3c 2f    append xml "</
110c0 74 65 78 74 3e 5c 6e 22 0d 0a 20 20 20 20 20 20  text>\n"..      
110d0 20 20 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74        if { [dict
110e0 20 73 69 7a 65 20 24 63 6f 70 79 5f 69 6e 66 6f   size $copy_info
110f0 5d 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20 20 20  ] == 0 } {..    
11100 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63 74              dict
11110 20 73 65 74 20 64 20 69 64 73 20 24 69 64 20 62   set d ids $id b
11120 62 6f 78 4c 20 5b 64 69 63 74 5f 67 65 74 64 20  boxL [dict_getd 
11130 24 64 20 69 64 73 20 24 69 64 20 62 62 6f 78 20  $d ids $id bbox 
11140 22 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ""]..           
11150 20 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20       dict set d 
11160 69 64 73 20 24 69 64 20 61 6e 67 6c 65 20 30 0d  ids $id angle 0.
11170 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
11180 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11190 20 20 20 63 6f 70 79 20 7b 0d 0a 20 20 20 20 20     copy {..     
111a0 20 20 20 20 20 20 20 73 65 74 20 69 64 43 20 5b         set idC [
111b0 6a 6f 69 6e 20 5b 6c 72 61 6e 67 65 20 5b 73 70  join [lrange [sp
111c0 6c 69 74 20 24 69 64 20 2e 5d 20 30 20 65 6e 64  lit $id .] 0 end
111d0 2d 31 5d 20 2e 5d 0d 0a 20 20 20 20 20 20 20 20  -1] .]..        
111e0 20 20 20 20 73 65 74 20 69 64 43 20 5b 72 65 73      set idC [res
111f0 6f 6c 76 65 5f 69 64 20 24 69 64 43 20 24 69 64  olve_id $idC $id
11200 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ]..            s
11210 65 74 20 69 64 73 4c 69 73 74 20 5b 6c 69 73 74  et idsList [list
11220 20 24 69 64 43 5d 0d 0a 20 20 20 20 20 20 20 20   $idC]..        
11230 20 20 20 20 73 65 74 20 69 63 20 5b 67 69 76 65      set ic [give
11240 5f 70 72 6f 70 44 20 24 64 20 24 69 64 20 69 6e  _propD $d $id in
11250 63 6c 75 64 65 5f 63 68 69 6c 64 72 65 6e 20 30  clude_children 0
11260 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ]..            i
11270 66 20 7b 20 24 69 63 20 7d 20 7b 0d 0a 20 20 20  f { $ic } {..   
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70               lap
11290 70 65 6e 64 20 69 64 73 4c 69 73 74 20 7b 2a 7d  pend idsList {*}
112a0 5b 67 69 76 65 5f 64 65 73 63 65 6e 64 61 6e 74  [give_descendant
112b0 73 20 24 69 64 43 20 24 69 64 5d 0d 0a 20 20 20  s $idC $id]..   
112c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
112d0 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20          ..      
112e0 20 20 20 20 20 20 73 65 74 20 6e 20 5b 67 69 76        set n [giv
112f0 65 5f 70 72 6f 70 44 20 24 64 20 24 69 64 20 6e  e_propD $d $id n
11300 75 6d 62 65 72 20 31 5d 0d 0a 20 20 20 20 20 20  umber 1]..      
11310 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20        ..        
11320 20 20 20 20 73 65 74 20 73 74 79 6c 65 5f 6e 61      set style_na
11330 6d 65 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20  me ""..         
11340 20 20 20 66 6f 72 65 61 63 68 20 22 6e 4c 20 76     foreach "nL v
11350 4c 22 20 5b 64 69 63 74 20 67 65 74 20 24 64 20  L" [dict get $d 
11360 69 64 73 20 24 69 64 20 70 72 6f 70 73 5d 20 7b  ids $id props] {
11370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11380 20 20 69 66 20 7b 20 24 6e 4c 20 65 71 20 22 63    if { $nL eq "c
11390 6c 61 73 73 22 20 7d 20 7b 0d 0a 20 20 20 20 20  lass" } {..     
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
113b0 66 20 7b 20 24 73 74 79 6c 65 5f 6e 61 6d 65 20  f { $style_name 
113c0 65 71 20 22 22 20 7d 20 7b 0d 0a 20 20 20 20 20  eq "" } {..     
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 73 65 74 20 73 74 79 6c 65 5f 6e 61 6d     set style_nam
113f0 65 20 24 76 4c 0d 0a 20 20 20 20 20 20 20 20 20  e $vL..         
11400 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
11420 65 6c 73 65 69 66 20 7b 20 24 6e 4c 20 65 71 20  elseif { $nL eq 
11430 22 63 6f 6e 6e 65 63 74 2d 63 6c 61 73 73 22 20  "connect-class" 
11440 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
11450 20 20 20 20 20 20 20 20 20 73 65 74 20 73 74 79           set sty
11460 6c 65 5f 6e 61 6d 65 20 24 76 4c 0d 0a 20 20 20  le_name $vL..   
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
11480 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
11490 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20             if { 
114a0 24 73 74 79 6c 65 5f 6e 61 6d 65 20 65 71 20 22  $style_name eq "
114b0 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  " } {..         
114c0 20 20 20 20 20 20 20 73 65 74 20 73 74 79 6c 65         set style
114d0 5f 6e 61 6d 65 20 5b 67 69 76 65 5f 70 72 6f 70  _name [give_prop
114e0 44 20 24 64 20 24 69 64 43 20 63 6c 61 73 73 20  D $d $idC class 
114f0 22 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ""]..           
11500 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
11510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  ..            la
11520 73 73 69 67 6e 20 5b 73 70 6c 69 74 20 5b 67 69  ssign [split [gi
11530 76 65 5f 70 72 6f 70 44 20 24 64 20 24 69 64 20  ve_propD $d $id 
11540 6f 70 65 72 61 74 69 6f 6e 20 74 72 61 6e 73 6c  operation transl
11550 61 74 69 6f 6e 5d 20 2c 5d 20 5c 0d 0a 20 20 20  ation] ,] \..   
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65               ope
11570 72 61 74 69 6f 6e 20 6f 70 0d 0a 20 20 20 20 20  ration op..     
11580 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20         ..       
11590 20 20 20 20 20 64 69 63 74 20 73 65 74 20 63 6f       dict set co
115a0 70 79 5f 69 6e 66 6f 20 73 74 79 6c 65 20 24 73  py_info style $s
115b0 74 79 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  tyle..          
115c0 20 20 64 69 63 74 20 73 65 74 20 63 6f 70 79 5f    dict set copy_
115d0 69 6e 66 6f 20 6c 61 62 65 6c 73 20 5b 67 69 76  info labels [giv
115e0 65 5f 70 72 6f 70 44 20 24 64 20 24 69 64 20 6c  e_propD $d $id l
115f0 61 62 65 6c 73 20 22 22 5d 0d 0a 20 20 20 20 20  abels ""]..     
11600 20 20 20 20 20 20 20 69 66 20 7b 20 21 5b 64 69         if { ![di
11610 63 74 20 65 78 69 73 74 73 20 24 63 6f 70 79 5f  ct exists $copy_
11620 69 6e 66 6f 20 73 74 79 6c 65 5f 6e 61 6d 65 5d  info style_name]
11630 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
11640 20 20 20 20 20 20 64 69 63 74 20 73 65 74 20 63        dict set c
11650 6f 70 79 5f 69 6e 66 6f 20 73 74 79 6c 65 5f 6e  opy_info style_n
11660 61 6d 65 20 24 73 74 79 6c 65 5f 6e 61 6d 65 0d  ame $style_name.
11670 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
11680 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63 74              dict
11690 20 73 65 74 20 63 6f 70 79 5f 69 6e 66 6f 20 69   set copy_info i
116a0 64 20 24 69 64 0d 0a 20 20 20 20 20 20 20 20 20  d $id..         
116b0 20 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65     if { ![dict e
116c0 78 69 73 74 73 20 24 63 6f 70 79 5f 69 6e 66 6f  xists $copy_info
116d0 20 63 6f 6e 6e 65 63 74 5d 20 7d 20 7b 0d 0a 20   connect] } {.. 
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
116f0 69 63 74 20 73 65 74 20 63 6f 70 79 5f 69 6e 66  ict set copy_inf
11700 6f 20 63 6f 6e 6e 65 63 74 20 5b 67 69 76 65 5f  o connect [give_
11710 70 72 6f 70 44 20 24 64 20 24 69 64 20 63 6f 6e  propD $d $id con
11720 6e 65 63 74 20 22 22 5d 0d 0a 20 20 20 20 20 20  nect ""]..      
11730 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11740 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20       ..         
11750 20 20 20 6c 61 73 73 69 67 6e 20 22 22 20 64 65     lassign "" de
11760 6c 74 61 20 64 65 6c 74 61 5f 70 6f 69 6e 74 73  lta delta_points
11770 20 70 6f 69 6e 74 73 0d 0a 20 20 20 20 20 20 20   points..       
11780 20 20 20 20 20 66 6f 72 20 7b 20 73 65 74 20 69       for { set i
11790 20 30 20 7d 20 7b 20 24 69 20 3c 20 5b 6c 6c 65   0 } { $i < [lle
117a0 6e 67 74 68 20 24 70 6e 74 73 5d 20 7d 20 7b 20  ngth $pnts] } { 
117b0 69 6e 63 72 20 69 20 7d 20 7b 0d 0a 20 20 20 20  incr i } {..    
117c0 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73              lass
117d0 69 67 6e 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74  ign [lindex $pnt
117e0 73 20 24 69 5d 20 74 79 70 65 20 78 20 79 0d 0a  s $i] type x y..
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 69 66 20 7b 20 24 74 79 70 65 20 65 71 20 22 64  if { $type eq "d
11810 65 6c 74 61 2d 70 6f 69 6e 74 22 20 7d 20 7b 0d  elta-point" } {.
11820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11830 20 20 20 20 20 69 66 20 7b 20 24 69 20 3d 3d 20       if { $i == 
11840 30 20 7c 7c 20 5b 6c 69 6e 64 65 78 20 24 70 6e  0 || [lindex $pn
11850 74 73 20 24 69 2d 31 20 30 5d 20 6e 65 20 22 70  ts $i-1 0] ne "p
11860 6f 69 6e 74 22 20 7d 20 7b 0d 0a 20 20 20 20 20  oint" } {..     
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 73 65 74 20 64 65 6c 74 61 20 22 24 78     set delta "$x
11890 20 24 79 22 0d 0a 20 20 20 20 20 20 20 20 20 20   $y"..          
118a0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
118b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
118c0 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73              lass
118d0 69 67 6e 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74  ign [lindex $pnt
118e0 73 20 24 69 2d 31 5d 20 2d 20 78 50 20 79 50 0d  s $i-1] - xP yP.
118f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11900 20 20 20 20 20 20 20 20 20 64 69 63 74 20 73 65           dict se
11910 74 20 64 65 6c 74 61 5f 70 6f 69 6e 74 73 20 22  t delta_points "
11920 24 78 50 20 24 79 50 22 20 22 24 78 20 24 79 22  $xP $yP" "$x $y"
11930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11940 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11950 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
11960 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
11970 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 70         lappend p
11980 6f 69 6e 74 73 20 22 24 78 20 24 79 22 0d 0a 20  oints "$x $y".. 
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
119a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
119b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
119c0 7b 20 24 6f 70 20 6e 65 20 22 22 20 7d 20 7b 0d  { $op ne "" } {.
119d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119e0 20 73 65 74 20 64 65 6c 74 61 20 22 30 20 30 22   set delta "0 0"
119f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11a00 20 20 73 65 74 20 63 20 30 0d 0a 20 20 20 20 20    set c 0..     
11a10 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 72             set r
11a20 65 78 20 7b 5c 41 5c 73 2a 28 5b 2d 2b 5c 64 65  ex {\A\s*([-+\de
11a30 2e 5d 2b 29 5b 2a 5d 50 28 5c 64 2b 29 7d 0d 0a  .]+)[*]P(\d+)}..
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 77 68 69 6c 65 20 7b 20 5b 72 65 67 65 78 70 20  while { [regexp 
11a60 2d 73 74 61 72 74 20 24 63 20 2d 69 6e 64 69 63  -start $c -indic
11a70 65 73 20 24 72 65 78 20 24 6f 70 20 61 6c 6c 20  es $rex $op all 
11a80 61 6c 70 68 61 49 20 70 49 5d 20 7d 20 7b 0d 0a  alphaI pI] } {..
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 20 73 65 74 20 61 6c 70 68 61 20 5b 73      set alpha [s
11ab0 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6f 70 20  tring range $op 
11ac0 7b 2a 7d 24 61 6c 70 68 61 49 5d 0d 0a 20 20 20  {*}$alphaI]..   
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ae0 20 73 65 74 20 70 20 5b 73 74 72 69 6e 67 20 72   set p [string r
11af0 61 6e 67 65 20 24 6f 70 20 7b 2a 7d 24 70 49 5d  ange $op {*}$pI]
11b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11b10 20 20 20 20 20 20 73 65 74 20 76 20 5b 6c 72 61        set v [lra
11b20 6e 67 65 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74  nge [lindex $pnt
11b30 73 20 24 70 2d 31 5d 20 31 20 32 5d 0d 0a 20 20  s $p-1] 1 2]..  
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 20 20 73 65 74 20 64 65 6c 74 61 20 5b 6d 3a 3a    set delta [m::
11b60 61 78 70 79 20 24 61 6c 70 68 61 20 24 76 20 24  axpy $alpha $v $
11b70 64 65 6c 74 61 5d 0d 0a 20 20 20 20 20 20 20 20  delta]..        
11b80 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
11b90 63 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78  c [expr {[lindex
11ba0 20 24 61 6c 6c 20 31 5d 2b 31 7d 5d 0d 0a 20 20   $all 1]+1}]..  
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
11bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11bd0 20 69 66 20 7b 20 21 5b 72 65 67 65 78 70 20 2d   if { ![regexp -
11be0 73 74 61 72 74 20 24 63 20 7b 5c 41 5c 73 2a 24  start $c {\A\s*$
11bf0 7d 20 24 6f 70 5d 20 7d 20 7b 0d 0a 20 20 20 20  } $op] } {..    
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 73 65 74 5f 65 72 72 6f 72 20 24 64 20 24 69 64  set_error $d $id
11c20 20 22 27 63 6f 70 79 27 20 65 78 70 72 65 73 73   "'copy' express
11c30 69 6f 6e 20 6e 6f 74 20 63 6f 72 72 65 63 74 22  ion not correct"
11c40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11c50 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
11c60 20 7d 20 65 6c 73 65 69 66 20 7b 20 24 64 65 6c   } elseif { $del
11c70 74 61 20 65 71 20 22 22 20 26 26 20 5b 64 69 63  ta eq "" && [dic
11c80 74 20 73 69 7a 65 20 24 64 65 6c 74 61 5f 70 6f  t size $delta_po
11c90 69 6e 74 73 5d 20 3d 3d 20 30 20 7d 20 7b 0d 0a  ints] == 0 } {..
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 70  if { [llength $p
11cc0 6f 69 6e 74 73 5d 20 3d 3d 20 32 20 7d 20 7b 0d  oints] == 2 } {.
11cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11ce0 20 20 20 20 20 73 65 74 20 64 65 6c 74 61 20 5b       set delta [
11cf0 6d 3a 3a 73 75 62 20 5b 6c 69 6e 64 65 78 20 24  m::sub [lindex $
11d00 70 6f 69 6e 74 73 20 31 5d 20 5b 6c 69 6e 64 65  points 1] [linde
11d10 78 20 24 70 6f 69 6e 74 73 20 30 5d 5d 0d 0a 20  x $points 0]].. 
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11d30 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
11d50 5f 65 72 72 6f 72 20 24 64 20 24 69 64 20 22 27  _error $d $id "'
11d60 63 6f 70 79 27 20 6d 75 73 74 20 68 61 76 65 20  copy' must have 
11d70 61 20 64 65 6c 74 61 2d 70 6f 69 6e 74 20 70 72  a delta-point pr
11d80 6f 70 65 72 74 79 20 6f 72 20 74 77 6f 20 70 6f  operty or two po
11d90 69 6e 74 73 22 0d 0a 20 20 20 20 20 20 20 20 20  ints"..         
11da0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11db0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
11dc0 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20 20       ..         
11dd0 20 20 20 66 6f 72 20 7b 20 73 65 74 20 69 20 31     for { set i 1
11de0 20 7d 20 7b 20 24 69 20 3c 3d 20 24 6e 20 7d 20   } { $i <= $n } 
11df0 7b 20 69 6e 63 72 20 69 20 7d 20 7b 0d 0a 20 20  { incr i } {..  
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
11e10 74 20 63 20 5b 64 69 63 74 5f 67 65 74 64 20 24  t c [dict_getd $
11e20 63 6f 70 79 5f 69 6e 66 6f 20 6f 70 65 72 61 74  copy_info operat
11e30 69 6f 6e 73 20 22 22 5d 0d 0a 20 20 20 20 20 20  ions ""]..      
11e40 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
11e50 64 20 63 20 5b 64 69 63 74 20 63 72 65 61 74 65  d c [dict create
11e60 20 6f 70 65 72 61 74 69 6f 6e 20 24 6f 70 65 72   operation $oper
11e70 61 74 69 6f 6e 20 64 65 6c 74 61 20 5c 0d 0a 20  ation delta \.. 
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 20 20 24 64 65 6c 74 61 20 64 65         $delta de
11ea0 6c 74 61 5f 70 6f 69 6e 74 73 20 24 64 65 6c 74  lta_points $delt
11eb0 61 5f 70 6f 69 6e 74 73 5d 0d 0a 20 20 20 20 20  a_points]..     
11ec0 20 20 20 20 20 20 20 20 20 20 20 64 69 63 74 20             dict 
11ed0 73 65 74 20 63 6f 70 79 5f 69 6e 66 6f 20 6f 70  set copy_info op
11ee0 65 72 61 74 69 6f 6e 73 20 24 63 0d 0a 20 20 20  erations $c..   
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
11f00 65 61 63 68 20 69 64 43 20 24 69 64 73 4c 69 73  each idC $idsLis
11f10 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t {..           
11f20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 64 43           set idC
11f30 20 5b 72 65 73 6f 6c 76 65 5f 69 64 20 24 69 64   [resolve_id $id
11f40 43 20 24 69 64 5d 0d 0a 20 20 20 20 20 20 20 20  C $id]..        
11f50 20 20 20 20 20 20 20 20 20 20 20 20 63 72 65 61              crea
11f60 74 65 5f 65 6e 74 69 74 79 20 24 69 64 43 20 24  te_entity $idC $
11f70 63 6f 70 79 5f 69 6e 66 6f 0d 0a 20 20 20 20 20  copy_info..     
11f80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
11f90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
11fa0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11fb0 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20  default {..     
11fc0 20 20 20 20 20 20 20 73 65 74 5f 65 72 72 6f 72         set_error
11fd0 20 24 64 20 24 69 64 20 22 75 6e 6b 6e 6f 77 6e   $d $id "unknown
11fe0 20 63 6f 6d 6d 61 6e 64 20 27 24 63 6d 64 27 22   command '$cmd'"
11ff0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
12000 20 7d 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 73 76   }..}....proc sv
12010 67 6d 6c 3a 3a 70 61 73 74 65 5f 65 6e 74 69 74  gml::paste_entit
12020 79 20 7b 20 6e 6f 64 65 20 65 6e 74 5f 74 79 70  y { node ent_typ
12030 65 20 70 72 6f 70 73 20 74 65 78 74 20 6d 54 20  e props text mT 
12040 73 74 79 6c 65 73 4e 20 73 74 79 6c 65 5f 6e 75  stylesN style_nu
12050 6d 4e 20 7d 20 7b 0d 0a 20 20 20 20 75 70 76 61  mN } {..    upva
12060 72 20 31 20 24 73 74 79 6c 65 73 4e 20 73 74 79  r 1 $stylesN sty
12070 6c 65 73 0d 0a 20 20 20 20 75 70 76 61 72 20 31  les..    upvar 1
12080 20 24 73 74 79 6c 65 5f 6e 75 6d 4e 20 73 74 79   $style_numN sty
12090 6c 65 5f 6e 75 6d 0d 0a 20 20 20 20 0d 0a 20 20  le_num..    ..  
120a0 20 20 73 65 74 20 70 72 6f 70 73 56 20 5b 6c 69    set propsV [li
120b0 73 74 20 66 69 6c 6c 20 73 74 72 6f 6b 65 20 6f  st fill stroke o
120c0 70 61 63 69 74 79 20 73 74 72 6f 6b 65 2d 77 69  pacity stroke-wi
120d0 64 74 68 20 73 74 72 6f 6b 65 2d 64 61 73 68 61  dth stroke-dasha
120e0 72 72 61 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  rray \..        
120f0 20 20 20 20 66 6f 6e 74 2d 73 74 79 6c 65 20 66      font-style f
12100 6f 6e 74 2d 77 65 69 67 68 74 20 66 6f 6e 74 2d  ont-weight font-
12110 73 69 7a 65 20 66 6f 6e 74 2d 66 61 6d 69 6c 79  size font-family
12120 5d 0d 0a 20 20 20 20 0d 0a 20 20 20 20 73 65 74  ]..    ..    set
12130 20 6e 6f 64 65 73 20 5b 6c 69 73 74 20 24 6e 6f   nodes [list $no
12140 64 65 5d 0d 0a 20 20 20 20 6c 61 70 70 65 6e 64  de]..    lappend
12150 20 6e 6f 64 65 73 20 7b 2a 7d 5b 24 6e 6f 64 65   nodes {*}[$node
12160 20 73 6e 20 2a 5d 0d 0a 20 20 20 20 0d 0a 20 20   sn *]..    ..  
12170 20 20 73 65 74 20 73 74 79 6c 65 73 44 20 22 22    set stylesD ""
12180 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6e 6f  ..    foreach no
12190 64 65 49 20 24 6e 6f 64 65 73 20 7b 0d 0a 20 20  deI $nodes {..  
121a0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 76        foreach nv
121b0 20 5b 73 70 6c 69 74 20 5b 24 6e 6f 64 65 49 20   [split [$nodeI 
121c0 40 73 74 79 6c 65 20 22 22 5d 20 22 3b 22 5d 20  @style ""] ";"] 
121d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
121e0 61 73 73 69 67 6e 20 5b 73 70 6c 69 74 20 24 6e  assign [split $n
121f0 76 20 3a 5d 20 6e 20 76 0d 0a 20 20 20 20 20 20  v :] n v..      
12200 20 20 20 20 20 20 69 66 20 7b 20 24 6e 20 69 6e        if { $n in
12210 20 24 70 72 6f 70 73 56 20 7d 20 7b 0d 0a 20 20   $propsV } {..  
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
12230 20 7b 20 24 6e 20 65 71 20 22 66 6f 6e 74 2d 73   { $n eq "font-s
12240 69 7a 65 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20  ize" } {..      
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
12260 67 65 78 70 20 7b 28 5b 2d 2b 5c 64 65 2e 5d 2b  gexp {([-+\de.]+
12270 29 5c 73 2a 28 5c 77 2a 29 7d 20 24 76 20 7b 7d  )\s*(\w*)} $v {}
12280 20 76 76 20 75 6e 69 74 0d 0a 20 20 20 20 20 20   vv unit..      
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
122a0 73 73 69 67 6e 20 5b 6d 3a 3a 6d 61 74 6d 75 6c  ssign [m::matmul
122b0 20 24 6d 54 20 22 24 76 76 20 30 22 5d 20 76 76   $mT "$vv 0"] vv
122c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
122d0 20 20 20 20 20 20 73 65 74 20 76 20 22 5b 66 6f        set v "[fo
122e0 72 6d 61 74 20 25 2e 30 66 20 24 76 76 5d 24 75  rmat %.0f $vv]$u
122f0 6e 69 74 22 0d 0a 20 20 20 20 20 20 20 20 20 20  nit"..          
12300 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12310 20 20 20 20 20 20 20 20 20 64 69 63 74 20 73 65           dict se
12320 74 20 73 74 79 6c 65 73 44 20 24 6e 20 24 76 0d  t stylesD $n $v.
12330 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
12340 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d          }..    }
12350 0d 0a 20 20 20 20 73 65 74 20 73 74 79 6c 65 20  ..    set style 
12360 22 22 0d 0a 20 20 20 20 64 69 63 74 20 66 6f 72  ""..    dict for
12370 20 22 6e 20 76 22 20 24 73 74 79 6c 65 73 44 20   "n v" $stylesD 
12380 7b 20 61 70 70 65 6e 64 20 73 74 79 6c 65 20 22  { append style "
12390 24 6e 3a 24 76 3b 22 20 7d 0d 0a 20 20 20 20 0d  $n:$v;" }..    .
123a0 0a 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20  .    if { [dict 
123b0 65 78 69 73 74 73 20 24 73 74 79 6c 65 73 20 76  exists $styles v
123c0 20 24 73 74 79 6c 65 5d 20 7d 20 7b 0d 0a 20 20   $style] } {..  
123d0 20 20 20 20 20 20 73 65 74 20 73 74 79 6c 65 5f        set style_
123e0 6e 61 6d 65 20 5b 64 69 63 74 20 67 65 74 20 24  name [dict get $
123f0 73 74 79 6c 65 73 20 76 20 24 73 74 79 6c 65 5d  styles v $style]
12400 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
12410 20 20 20 20 20 20 20 20 73 65 74 20 73 74 79 6c          set styl
12420 65 5f 6e 61 6d 65 20 22 73 74 79 6c 65 24 73 74  e_name "style$st
12430 79 6c 65 5f 6e 75 6d 22 0d 0a 20 20 20 20 20 20  yle_num"..      
12440 20 20 69 6e 63 72 20 73 74 79 6c 65 5f 6e 75 6d    incr style_num
12450 0d 0a 20 20 20 20 20 20 20 20 64 69 63 74 20 73  ..        dict s
12460 65 74 20 73 74 79 6c 65 73 20 6e 20 24 73 74 79  et styles n $sty
12470 6c 65 5f 6e 61 6d 65 20 24 73 74 79 6c 65 0d 0a  le_name $style..
12480 20 20 20 20 20 20 20 20 64 69 63 74 20 73 65 74          dict set
12490 20 73 74 79 6c 65 73 20 76 20 24 73 74 79 6c 65   styles v $style
124a0 20 24 73 74 79 6c 65 5f 6e 61 6d 65 0d 0a 20 20   $style_name..  
124b0 20 20 7d 0d 0a 20 20 20 20 73 65 74 20 69 64 20    }..    set id 
124c0 5b 24 6e 6f 64 65 20 40 69 64 20 22 22 5d 0d 0a  [$node @id ""]..
124d0 20 20 20 20 73 65 74 20 74 78 74 20 22 24 69 64      set txt "$id
124e0 22 0d 0a 20 20 20 20 69 66 20 7b 20 5b 73 74 72  "..    if { [str
124f0 69 6e 67 20 6c 65 6e 67 74 68 20 24 69 64 5d 20  ing length $id] 
12500 3c 20 31 35 20 7d 20 7b 0d 0a 20 20 20 20 20 20  < 15 } {..      
12510 20 20 61 70 70 65 6e 64 20 74 78 74 20 5b 73 74    append txt [st
12520 72 69 6e 67 20 72 65 70 65 61 74 20 22 20 22 20  ring repeat " " 
12530 5b 65 78 70 72 20 7b 31 35 2d 5b 73 74 72 69 6e  [expr {15-[strin
12540 67 20 6c 65 6e 67 74 68 20 24 69 64 5d 7d 5d 5d  g length $id]}]]
12550 0d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  ..    } else {..
12560 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 74          append t
12570 78 74 20 22 20 22 0d 0a 20 20 20 20 7d 0d 0a 20  xt " "..    }.. 
12580 20 20 20 61 70 70 65 6e 64 20 74 78 74 20 22 24     append txt "$
12590 65 6e 74 5f 74 79 70 65 20 24 70 72 6f 70 73 20  ent_type $props 
125a0 63 6c 3a 24 73 74 79 6c 65 5f 6e 61 6d 65 3b 5c  cl:$style_name;\
125b0 6e 22 0d 0a 20 20 20 20 24 74 65 78 74 20 69 6e  n"..    $text in
125c0 73 65 72 74 20 69 6e 73 65 72 74 20 24 74 78 74  sert insert $txt
125d0 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20 73 76 67 6d  ..}....proc svgm
125e0 6c 3a 3a 70 61 73 74 65 20 7b 20 78 6d 6c 20 7d  l::paste { xml }
125f0 20 7b 0d 0a 20 20 20 20 0d 0a 20 20 20 20 70 61   {..    ..    pa
12600 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 63 6f  ckage require co
12610 6d 70 61 73 73 5f 75 74 69 6c 73 3a 3a 63 0d 0a  mpass_utils::c..
12620 20 20 20 20 73 65 74 20 64 6f 63 20 5b 70 3a 3a      set doc [p::
12630 78 6d 6c 20 70 61 72 73 65 20 24 78 6d 6c 5d 0d  xml parse $xml].
12640 0a 20 20 20 20 0d 0a 20 20 20 20 73 65 74 20 77  .    ..    set w
12650 69 64 74 68 47 20 38 30 30 0d 0a 20 20 20 20 0d  idthG 800..    .
12660 0a 20 20 20 20 73 65 74 20 73 76 67 4e 6f 64 65  .    set svgNode
12670 20 5b 24 64 6f 63 20 64 6f 63 75 6d 65 6e 74 45   [$doc documentE
12680 6c 65 6d 65 6e 74 5d 0d 0a 20 20 20 20 73 65 74  lement]..    set
12690 20 77 69 64 74 68 20 5b 24 73 76 67 4e 6f 64 65   width [$svgNode
126a0 20 40 77 69 64 74 68 20 31 30 30 5d 0d 0a 20 20   @width 100]..  
126b0 20 20 73 65 74 20 68 65 69 67 68 74 20 5b 24 73    set height [$s
126c0 76 67 4e 6f 64 65 20 40 68 65 69 67 68 74 20 31  vgNode @height 1
126d0 30 30 5d 0d 0a 20 20 20 20 73 65 74 20 76 69 65  00]..    set vie
126e0 77 42 6f 78 20 5b 24 73 76 67 4e 6f 64 65 20 40  wBox [$svgNode @
126f0 76 69 65 77 42 6f 78 20 22 30 20 30 20 24 77 69  viewBox "0 0 $wi
12700 64 74 68 20 24 68 65 69 67 68 74 22 5d 0d 0a 20  dth $height"].. 
12710 20 20 20 0d 0a 20 20 20 20 73 65 74 20 74 65 78     ..    set tex
12720 74 20 24 52 61 6d 44 65 62 75 67 67 65 72 3a 3a  t $RamDebugger::
12730 74 65 78 74 0d 0a 20 20 20 20 73 65 74 20 69 64  text..    set id
12740 78 20 5b 24 74 65 78 74 20 69 6e 64 65 78 20 69  x [$text index i
12750 6e 73 65 72 74 5d 0d 0a 20 20 20 20 72 65 67 65  nsert]..    rege
12760 78 70 20 7b 5e 5c 64 2b 7d 20 24 69 64 78 20 6c  xp {^\d+} $idx l
12770 69 6e 65 0d 0a 20 20 20 20 73 65 74 20 66 6f 75  ine..    set fou
12780 6e 64 5f 73 74 61 72 74 20 30 0d 0a 20 20 20 20  nd_start 0..    
12790 66 6f 72 20 7b 20 73 65 74 20 69 20 24 6c 69 6e  for { set i $lin
127a0 65 20 7d 20 7b 20 24 69 20 3e 3d 20 31 20 7d 20  e } { $i >= 1 } 
127b0 7b 20 69 6e 63 72 20 69 20 2d 31 20 7d 20 7b 0d  { incr i -1 } {.
127c0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20 5b 72  .        if { [r
127d0 65 67 65 78 70 20 7b 5e 5c 73 2a 7e 7e 7e 7e 5c  egexp {^\s*~~~~\
127e0 73 2a 24 7d 20 5b 24 74 65 78 74 20 67 65 74 20  s*$} [$text get 
127f0 24 69 2e 30 20 22 24 69 2e 30 20 6c 69 6e 65 65  $i.0 "$i.0 linee
12800 6e 64 22 5d 5d 20 7d 20 7b 0d 0a 20 20 20 20 20  nd"]] } {..     
12810 20 20 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20         break..  
12820 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12830 20 69 66 20 7b 20 5b 72 65 67 65 78 70 20 7b 5e   if { [regexp {^
12840 5c 73 2a 7e 7e 7e 7e 2e 2a 73 76 67 6d 6c 7d 20  \s*~~~~.*svgml} 
12850 5b 24 74 65 78 74 20 67 65 74 20 24 69 2e 30 20  [$text get $i.0 
12860 22 24 69 2e 30 20 6c 69 6e 65 65 6e 64 22 5d 5d  "$i.0 lineend"]]
12870 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
12880 20 20 73 65 74 20 66 6f 75 6e 64 5f 73 74 61 72    set found_star
12890 74 20 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t 1..           
128a0 20 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20   break..        
128b0 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 69 66  }..    }..    if
128c0 20 7b 20 5b 24 74 65 78 74 20 63 6f 6d 70 61 72   { [$text compar
128d0 65 20 24 69 64 78 20 3d 3d 20 22 24 69 64 78 20  e $idx == "$idx 
128e0 6c 69 6e 65 73 74 61 72 74 22 5d 20 3d 3d 20 30  linestart"] == 0
128f0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 24 74   } {..        $t
12900 65 78 74 20 69 6e 73 65 72 74 20 69 6e 73 65 72  ext insert inser
12910 74 20 22 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20  t "\n"..        
12920 73 65 74 20 69 64 78 20 5b 24 74 65 78 74 20 69  set idx [$text i
12930 6e 64 65 78 20 22 24 69 64 78 20 2b 20 31 6c 20  ndex "$idx + 1l 
12940 6c 69 6e 65 73 74 61 72 74 22 5d 0d 0a 20 20 20  linestart"]..   
12950 20 7d 0d 0a 20 20 20 20 69 66 20 7b 20 5b 24 74   }..    if { [$t
12960 65 78 74 20 63 6f 6d 70 61 72 65 20 24 69 64 78  ext compare $idx
12970 20 3d 3d 20 22 24 69 64 78 20 6c 69 6e 65 65 6e   == "$idx lineen
12980 64 22 5d 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20  d"] == 0 } {..  
12990 20 20 20 20 20 20 24 74 65 78 74 20 69 6e 73 65        $text inse
129a0 72 74 20 69 6e 73 65 72 74 20 22 5c 6e 22 0d 0a  rt insert "\n"..
129b0 20 20 20 20 20 20 20 20 24 74 65 78 74 20 6d 61          $text ma
129c0 72 6b 20 73 65 74 20 69 6e 73 65 72 74 20 22 69  rk set insert "i
129d0 6e 73 65 72 74 2d 31 63 22 0d 0a 20 20 20 20 7d  nsert-1c"..    }
129e0 0d 0a 20 20 20 20 0d 0a 20 20 20 20 69 66 20 7b  ..    ..    if {
129f0 20 21 24 66 6f 75 6e 64 5f 73 74 61 72 74 20 7d   !$found_start }
12a00 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
12a10 72 20 5b 65 78 70 72 20 7b 31 2e 30 2a 5b 24 73  r [expr {1.0*[$s
12a20 76 67 4e 6f 64 65 20 40 77 69 64 74 68 20 38 30  vgNode @width 80
12a30 30 5d 2f 5b 24 73 76 67 4e 6f 64 65 20 40 68 65  0]/[$svgNode @he
12a40 69 67 68 74 20 24 77 69 64 74 68 47 5d 7d 5d 0d  ight $widthG]}].
12a50 0a 20 20 20 20 20 20 20 20 73 65 74 20 68 65 69  .        set hei
12a60 67 68 74 47 20 5b 66 6f 72 6d 61 74 20 25 30 2e  ghtG [format %0.
12a70 66 20 5b 65 78 70 72 20 7b 24 77 69 64 74 68 47  f [expr {$widthG
12a80 2f 24 72 7d 5d 5d 0d 0a 20 20 20 20 20 20 20 20  /$r}]]..        
12a90 24 74 65 78 74 20 69 6e 73 65 72 74 20 69 6e 73  $text insert ins
12aa0 65 72 74 20 22 7e 7e 7e 7e 20 7b 20 73 76 67 6d  ert "~~~~ { svgm
12ab0 6c 3d 5c 22 31 5c 22 20 66 69 6c 65 3d 5c 22 69  l=\"1\" file=\"i
12ac0 6d 61 67 65 2e 73 76 67 5c 22 20 7d 5c 6e 22 0d  mage.svg\" }\n".
12ad0 0a 20 20 20 20 20 20 20 20 24 74 65 78 74 20 69  .        $text i
12ae0 6e 73 65 72 74 20 69 6e 73 65 72 74 20 22 2b 73  nsert insert "+s
12af0 76 67 6d 6c 31 20 20 20 20 20 20 20 20 20 20 20  vgml1           
12b00 20 20 77 69 64 74 68 3a 24 77 69 64 74 68 47 3b    width:$widthG;
12b10 20 68 65 69 67 68 74 3a 24 68 65 69 67 68 74 47   height:$heightG
12b20 3b 5c 6e 22 0d 0a 20 20 20 20 20 20 20 20 24 74  ;\n"..        $t
12b30 65 78 74 20 69 6e 73 65 72 74 20 69 6e 73 65 72  ext insert inser
12b40 74 20 22 2b 61 6c 69 61 73 20 20 20 20 20 20 20  t "+alias       
12b50 20 20 20 20 20 20 20 70 6f 69 6e 74 3a 70 3b 20         point:p; 
12b60 64 65 6c 74 61 2d 70 6f 69 6e 74 3a 64 70 3b 20  delta-point:dp; 
12b70 77 69 64 74 68 2d 68 65 69 67 68 74 3a 77 68 3b  width-height:wh;
12b80 20 74 65 78 74 3a 74 3b 5c 6e 22 0d 0a 20 20 20   text:t;\n"..   
12b90 20 20 20 20 20 24 74 65 78 74 20 69 6e 73 65 72       $text inser
12ba0 74 20 69 6e 73 65 72 74 20 22 2b 61 6c 69 61 73  t insert "+alias
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
12bc0 63 68 6f 72 3a 61 3b 20 68 6f 72 69 7a 6f 6e 74  chor:a; horizont
12bd0 61 6c 2d 76 65 72 74 69 63 61 6c 3a 68 76 3b 20  al-vertical:hv; 
12be0 63 6c 61 73 73 3a 63 6c 3b 20 6e 75 6d 62 65 72  class:cl; number
12bf0 3a 6e 3b 5c 6e 5c 6e 22 0d 0a 20 20 20 20 7d 0d  :n;\n\n"..    }.
12c00 0a 20 20 20 20 0d 0a 20 20 20 20 73 65 74 20 6d  .    ..    set m
12c10 20 5b 6d 3a 3a 6d 6b 4d 61 74 72 69 78 20 33 20   [m::mkMatrix 3 
12c20 33 20 30 5d 0d 0a 20 20 20 20 6d 3a 3a 73 65 74  3 0]..    m::set
12c30 65 6c 65 6d 20 6d 20 30 20 30 20 5b 65 78 70 72  elem m 0 0 [expr
12c40 20 7b 31 30 30 2e 30 2f 5b 6c 69 6e 64 65 78 20   {100.0/[lindex 
12c50 24 76 69 65 77 42 6f 78 20 32 5d 7d 5d 0d 0a 20  $viewBox 2]}].. 
12c60 20 20 20 6d 3a 3a 73 65 74 65 6c 65 6d 20 6d 20     m::setelem m 
12c70 30 20 32 20 5b 65 78 70 72 20 7b 2d 31 30 30 2e  0 2 [expr {-100.
12c80 30 2a 5b 6c 69 6e 64 65 78 20 24 76 69 65 77 42  0*[lindex $viewB
12c90 6f 78 20 30 5d 2f 5b 6c 69 6e 64 65 78 20 24 76  ox 0]/[lindex $v
12ca0 69 65 77 42 6f 78 20 32 5d 7d 5d 0d 0a 20 20 20  iewBox 2]}]..   
12cb0 20 6d 3a 3a 73 65 74 65 6c 65 6d 20 6d 20 31 20   m::setelem m 1 
12cc0 31 20 5b 65 78 70 72 20 7b 31 30 30 2e 30 2f 5b  1 [expr {100.0/[
12cd0 6c 69 6e 64 65 78 20 24 76 69 65 77 42 6f 78 20  lindex $viewBox 
12ce0 33 5d 7d 5d 0d 0a 20 20 20 20 6d 3a 3a 73 65 74  3]}]..    m::set
12cf0 65 6c 65 6d 20 6d 20 31 20 32 20 5b 65 78 70 72  elem m 1 2 [expr
12d00 20 7b 2d 31 30 30 2e 30 2a 5b 6c 69 6e 64 65 78   {-100.0*[lindex
12d10 20 24 76 69 65 77 42 6f 78 20 31 5d 2f 5b 6c 69   $viewBox 1]/[li
12d20 6e 64 65 78 20 24 76 69 65 77 42 6f 78 20 33 5d  ndex $viewBox 3]
12d30 7d 5d 0d 0a 20 20 20 20 0d 0a 20 20 20 20 73 65  }]..    ..    se
12d40 74 20 6d 53 20 5b 6d 3a 3a 6d 6b 4d 61 74 72 69  t mS [m::mkMatri
12d50 78 20 32 20 32 20 30 5d 0d 0a 20 20 20 20 6d 3a  x 2 2 0]..    m:
12d60 3a 73 65 74 65 6c 65 6d 20 6d 53 20 30 20 30 20  :setelem mS 0 0 
12d70 5b 6d 3a 3a 67 65 74 65 6c 65 6d 20 24 6d 20 30  [m::getelem $m 0
12d80 20 30 5d 0d 0a 20 20 20 20 6d 3a 3a 73 65 74 65   0]..    m::sete
12d90 6c 65 6d 20 6d 53 20 31 20 31 20 5b 6d 3a 3a 67  lem mS 1 1 [m::g
12da0 65 74 65 6c 65 6d 20 24 6d 20 31 20 31 5d 0d 0a  etelem $m 1 1]..
12db0 20 20 20 20 0d 0a 20 20 20 20 73 65 74 20 6d 54      ..    set mT
12dc0 20 5b 6d 3a 3a 6d 6b 4d 61 74 72 69 78 20 32 20   [m::mkMatrix 2 
12dd0 32 20 30 5d 0d 0a 20 20 20 20 6d 3a 3a 73 65 74  2 0]..    m::set
12de0 65 6c 65 6d 20 6d 54 20 30 20 30 20 5b 65 78 70  elem mT 0 0 [exp
12df0 72 20 7b 31 2e 30 2a 24 77 69 64 74 68 47 2f 5b  r {1.0*$widthG/[
12e00 6c 69 6e 64 65 78 20 24 76 69 65 77 42 6f 78 20  lindex $viewBox 
12e10 32 5d 7d 5d 0d 0a 20 20 20 20 6d 3a 3a 73 65 74  2]}]..    m::set
12e20 65 6c 65 6d 20 6d 54 20 31 20 31 20 5b 65 78 70  elem mT 1 1 [exp
12e30 72 20 7b 31 2e 30 2a 24 77 69 64 74 68 47 2f 5b  r {1.0*$widthG/[
12e40 6c 69 6e 64 65 78 20 24 76 69 65 77 42 6f 78 20  lindex $viewBox 
12e50 33 5d 7d 5d 0d 0a 20 20 20 20 0d 0a 20 20 20 20  3]}]..    ..    
12e60 73 65 74 20 73 74 79 6c 65 73 20 22 22 3b 20 73  set styles ""; s
12e70 65 74 20 73 74 79 6c 65 5f 6e 75 6d 20 31 0d 0a  et style_num 1..
12e80 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 74 68      foreach path
12e90 4e 6f 64 65 20 5b 24 73 76 67 4e 6f 64 65 20 73  Node [$svgNode s
12ea0 6e 20 22 70 61 74 68 22 5d 20 7b 0d 0a 20 20 20  n "path"] {..   
12eb0 20 20 20 20 20 73 65 74 20 76 73 20 5b 72 65 67       set vs [reg
12ec0 65 78 70 20 2d 69 6e 6c 69 6e 65 20 2d 61 6c 6c  exp -inline -all
12ed0 20 7b 5b 61 2d 7a 41 2d 5a 5d 7c 5b 2d 2b 65 30   {[a-zA-Z]|[-+e0
12ee0 2d 39 2e 5d 2b 7d 20 5b 24 70 61 74 68 4e 6f 64  -9.]+} [$pathNod
12ef0 65 20 40 64 20 22 22 5d 5d 0d 0a 20 20 20 20 20  e @d ""]]..     
12f00 20 20 20 73 65 74 20 64 4e 20 22 22 0d 0a 20 20     set dN ""..  
12f10 20 20 20 20 20 20 73 65 74 20 63 6d 64 5f 70 72        set cmd_pr
12f20 65 76 20 22 22 0d 0a 20 20 20 20 20 20 20 20 73  ev ""..        s
12f30 65 74 20 70 6e 74 5f 70 72 65 76 20 22 22 0d 0a  et pnt_prev ""..
12f40 20 20 20 20 20 20 20 20 66 6f 72 20 7b 20 73 65          for { se
12f50 74 20 69 20 30 20 7d 20 7b 20 24 69 20 3c 20 5b  t i 0 } { $i < [
12f60 6c 6c 65 6e 67 74 68 20 24 76 73 5d 20 7d 20 7b  llength $vs] } {
12f70 20 69 6e 63 72 20 69 20 7d 20 7b 0d 0a 20 20 20   incr i } {..   
12f80 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20           switch 
12f90 5b 6c 69 6e 64 65 78 20 24 76 73 20 24 69 5d 20  [lindex $vs $i] 
12fa0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
12fb0 20 20 20 61 20 2d 20 41 20 7b 0d 0a 20 20 20 20     a - A {..    
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 6c 61 73 73 69 67 6e 20 5b 6c 72 61 6e 67 65 20  lassign [lrange 
12fe0 24 76 73 20 24 69 20 24 69 2b 37 5d 20 74 79 70  $vs $i $i+7] typ
12ff0 65 20 72 78 20 72 79 20 78 2d 61 78 69 73 2d 72  e rx ry x-axis-r
13000 6f 74 61 74 69 6f 6e 20 6c 61 72 67 65 2d 61 72  otation large-ar
13010 63 2d 66 6c 61 67 20 5c 0d 0a 20 20 20 20 20 20  c-flag \..      
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 73 77 65 65 70 2d 66 6c 61 67 20 78 20 79    sweep-flag x y
13040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13050 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 5b 6d        lassign [m
13060 3a 3a 6d 61 74 6d 75 6c 20 24 6d 53 20 22 24 72  ::matmul $mS "$r
13070 78 20 24 72 79 22 5d 20 72 78 20 72 79 0d 0a 20  x $ry"] rx ry.. 
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 20 20 20 69 66 20 7b 20 24 74 79 70 65 20 65 71     if { $type eq
130a0 20 22 41 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20   "A" } {..      
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 6c 61 73 73 69 67 6e 20 5b 6d 3a 3a 6d 61    lassign [m::ma
130d0 74 6d 75 6c 20 24 6d 20 22 24 78 20 24 79 20 31  tmul $m "$x $y 1
130e0 22 5d 20 78 20 79 0d 0a 20 20 20 20 20 20 20 20  "] x y..        
130f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
13100 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
13120 73 73 69 67 6e 20 5b 6d 3a 3a 6d 61 74 6d 75 6c  ssign [m::matmul
13130 20 24 6d 53 20 22 24 78 20 24 79 22 5d 20 78 20   $mS "$x $y"] x 
13140 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
13150 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73 69             lassi
13160 67 6e 20 5b 6d 3a 3a 61 64 64 20 24 70 6e 74 5f  gn [m::add $pnt_
13170 70 72 65 76 20 22 24 78 20 24 79 22 5d 20 78 20  prev "$x $y"] x 
13180 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
13190 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74             set t
131a0 79 70 65 20 41 0d 0a 20 20 20 20 20 20 20 20 20  ype A..         
131b0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131d0 20 20 73 65 74 20 70 6e 74 5f 70 72 65 76 20 22    set pnt_prev "
131e0 24 78 20 24 79 22 0d 0a 20 20 20 20 20 20 20 20  $x $y"..        
131f0 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
13200 65 6e 64 20 64 4e 20 24 74 79 70 65 20 7b 2a 7d  end dN $type {*}
13210 5b 66 6f 72 6d 61 74 20 22 25 2e 30 66 20 25 2e  [format "%.0f %.
13220 30 66 22 20 24 72 78 20 24 72 79 5d 20 24 7b 78  0f" $rx $ry] ${x
13230 2d 61 78 69 73 2d 72 6f 74 61 74 69 6f 6e 7d 20  -axis-rotation} 
13240 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
13250 20 20 20 20 20 20 20 20 20 20 20 24 7b 6c 61 72             ${lar
13260 67 65 2d 61 72 63 2d 66 6c 61 67 7d 20 24 7b 73  ge-arc-flag} ${s
13270 77 65 65 70 2d 66 6c 61 67 7d 20 7b 2a 7d 5b 66  weep-flag} {*}[f
13280 6f 72 6d 61 74 20 22 25 2e 30 66 20 25 2e 30 66  ormat "%.0f %.0f
13290 22 20 24 78 20 24 79 5d 0d 0a 20 20 20 20 20 20  " $x $y]..      
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
132b0 74 20 63 6d 64 5f 70 72 65 76 20 5b 6c 69 6e 64  t cmd_prev [lind
132c0 65 78 20 24 76 73 20 24 69 5d 0d 0a 20 20 20 20  ex $vs $i]..    
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 69 6e 63 72 20 69 20 37 0d 0a 20 20 20 20 20 20  incr i 7..      
132f0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 20 2d               m -
13310 20 4d 20 2d 20 6c 20 2d 20 4c 20 2d 20 71 20 2d   M - l - L - q -
13320 20 51 20 2d 20 63 20 2d 20 43 20 2d 20 73 20 2d   Q - c - C - s -
13330 20 53 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   S {..          
13340 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
13350 20 5b 6c 69 6e 64 65 78 20 24 76 73 20 24 69 5d   [lindex $vs $i]
13360 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
13370 20 20 20 20 20 20 20 20 20 20 20 20 6d 20 2d 20              m - 
13380 4d 20 2d 20 6c 20 2d 20 4c 20 7b 20 73 65 74 20  M - l - L { set 
13390 6e 70 6f 69 6e 74 73 20 31 20 7d 0d 0a 20 20 20  npoints 1 }..   
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 20 20 20 20 20 71 20 2d 20 51 20 2d 20 73 20 2d       q - Q - s -
133c0 20 53 20 7b 20 73 65 74 20 6e 70 6f 69 6e 74 73   S { set npoints
133d0 20 32 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20   2 }..          
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
133f0 2d 20 43 20 7b 20 73 65 74 20 6e 70 6f 69 6e 74  - C { set npoint
13400 73 20 33 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  s 3 }..         
13410 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 73 65 74 20 74 79 70 65 20 5b 6c 69 6e 64    set type [lind
13440 65 78 20 24 76 73 20 24 69 5d 0d 0a 23 20 20 20  ex $vs $i]..#   
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 69 66 20 7b 20 24 69 20 3d 3d 20 30 20 26    if { $i == 0 &
13470 26 20 24 74 79 70 65 20 65 71 20 22 6d 22 20 7d  & $type eq "m" }
13480 20 7b 0d 0a 23 20 20 20 20 20 20 20 20 20 20 20   {..#           
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
134a0 74 20 74 79 70 65 20 22 4d 22 0d 0a 23 20 20 20  t type "M"..#   
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
134d0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
134e0 20 64 4e 20 5b 73 74 72 69 6e 67 20 74 6f 75 70   dN [string toup
134f0 70 65 72 20 24 74 79 70 65 5d 0d 0a 20 20 20 20  per $type]..    
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 66 6f 72 20 7b 20 73 65 74 20 6a 20 30 20 7d 20  for { set j 0 } 
13520 7b 20 24 6a 20 3c 20 24 6e 70 6f 69 6e 74 73 20  { $j < $npoints 
13530 7d 20 7b 20 69 6e 63 72 20 6a 20 7d 20 7b 0d 0a  } { incr j } {..
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 20 20 20 20 20 73 65 74 20 69 64 78 20          set idx 
13560 5b 65 78 70 72 20 7b 24 69 2b 32 2a 24 6a 2b 31  [expr {$i+2*$j+1
13570 7d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  }]..            
13580 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73              lass
13590 69 67 6e 20 5b 6c 72 61 6e 67 65 20 24 76 73 20  ign [lrange $vs 
135a0 24 69 64 78 20 24 69 64 78 2b 31 5d 20 78 20 79  $idx $idx+1] x y
135b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
135c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20 24            if { $
135d0 74 79 70 65 20 69 6e 20 22 4d 20 4c 20 51 20 43  type in "M L Q C
135e0 20 53 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20   S" } {..       
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 20 20 20 6c 61 73 73 69 67 6e 20 5b 6d 3a       lassign [m:
13610 3a 6d 61 74 6d 75 6c 20 24 6d 20 22 24 78 20 24  :matmul $m "$x $
13620 79 20 31 22 5d 20 78 20 79 0d 0a 20 20 20 20 20  y 1"] x y..     
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24 74     } elseif { $t
13650 79 70 65 20 65 71 20 22 6d 22 20 26 26 20 24 69  ype eq "m" && $i
13660 20 3d 3d 20 30 20 7d 20 7b 0d 0a 20 20 20 20 20   == 0 } {..     
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 5b         lassign [
13690 6d 3a 3a 6d 61 74 6d 75 6c 20 24 6d 20 22 24 78  m::matmul $m "$x
136a0 20 24 79 20 31 22 5d 20 78 20 79 0d 0a 20 20 20   $y 1"] x y..   
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136c0 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73 69             lassi
136f0 67 6e 20 5b 6d 3a 3a 6d 61 74 6d 75 6c 20 24 6d  gn [m::matmul $m
13700 53 20 22 24 78 20 24 79 22 5d 20 78 20 79 0d 0a  S "$x $y"] x y..
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 73              lass
13730 69 67 6e 20 5b 6d 3a 3a 61 64 64 20 24 70 6e 74  ign [m::add $pnt
13740 5f 70 72 65 76 20 22 24 78 20 24 79 22 5d 20 78  _prev "$x $y"] x
13750 20 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   y..            
13760 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 20 20 20 20 20 69 66 20 7b 20 24 6a 20 3d         if { $j =
13790 3d 20 24 6e 70 6f 69 6e 74 73 2d 31 20 7d 20 7b  = $npoints-1 } {
137a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
137c0 74 20 70 6e 74 5f 70 72 65 76 20 22 24 78 20 24  t pnt_prev "$x $
137d0 79 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y"..            
137e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 64         lappend d
13810 4e 20 7b 2a 7d 5b 66 6f 72 6d 61 74 20 22 25 2e  N {*}[format "%.
13820 30 66 20 25 2e 30 66 22 20 24 78 20 24 79 5d 0d  0f %.0f" $x $y].
13830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13840 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
13850 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
13860 63 6d 64 5f 70 72 65 76 20 24 74 79 70 65 0d 0a  cmd_prev $type..
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 20 20 69 6e 63 72 20 69 20 5b 65 78 70 72      incr i [expr
13890 20 7b 32 2a 24 6e 70 6f 69 6e 74 73 7d 5d 0d 0a   {2*$npoints}]..
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
138c0 20 20 20 68 20 2d 20 48 20 2d 20 76 20 2d 20 56     h - H - v - V
138d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
138e0 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20          lassign 
138f0 5b 6c 72 61 6e 67 65 20 24 76 73 20 24 69 20 24  [lrange $vs $i $
13900 69 2b 31 5d 20 74 79 70 65 20 78 79 0d 0a 20 20  i+1] type xy..  
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13920 20 20 73 77 69 74 63 68 20 5b 6c 69 6e 64 65 78    switch [lindex
13930 20 24 76 73 20 24 69 5d 20 7b 0d 0a 20 20 20 20   $vs $i] {..    
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13950 20 20 20 20 68 20 2d 20 48 20 7b 20 73 65 74 20      h - H { set 
13960 78 20 24 78 79 20 3b 20 73 65 74 20 79 20 30 20  x $xy ; set y 0 
13970 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
13980 20 20 20 20 20 20 20 20 20 20 20 76 20 2d 20 56             v - V
13990 20 7b 20 73 65 74 20 78 20 30 20 20 20 3b 20 73   { set x 0   ; s
139a0 65 74 20 79 20 24 78 79 20 7d 0d 0a 20 20 20 20  et y $xy }..    
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
139d0 20 20 20 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e         if { [lin
139e0 64 65 78 20 24 76 73 20 24 69 5d 20 69 6e 20 22  dex $vs $i] in "
139f0 48 20 56 22 20 7d 20 7b 0d 0a 20 20 20 20 20 20  H V" } {..      
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 6c 61 73 73 69 67 6e 20 5b 6d 3a 3a 6d 61    lassign [m::ma
13a20 74 6d 75 6c 20 24 6d 20 22 24 78 20 24 79 20 31  tmul $m "$x $y 1
13a30 22 5d 20 78 20 79 0d 0a 20 20 20 20 20 20 20 20  "] x y..        
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 24 76 73  if { [lindex $vs
13a60 20 24 69 5d 20 65 71 20 22 48 22 20 7d 20 7b 0d   $i] eq "H" } {.
13a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
13a90 20 79 20 5b 6c 69 6e 64 65 78 20 24 70 6e 74 5f   y [lindex $pnt_
13aa0 70 72 65 76 20 31 5d 0d 0a 20 20 20 20 20 20 20  prev 1]..       
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ae0 20 20 20 20 20 20 20 73 65 74 20 78 20 5b 6c 69         set x [li
13af0 6e 64 65 78 20 24 70 6e 74 5f 70 72 65 76 20 30  ndex $pnt_prev 0
13b00 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
13b10 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 20 20 6c 61 73 73 69 67 6e 20 5b 6d 3a 3a      lassign [m::
13b60 6d 61 74 6d 75 6c 20 24 6d 53 20 22 24 78 20 24  matmul $mS "$x $
13b70 79 22 5d 20 78 20 79 0d 0a 20 20 20 20 20 20 20  y"] x y..       
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 6c 61 73 73 69 67 6e 20 5b 6d 3a 3a 61 64 64   lassign [m::add
13ba0 20 24 70 6e 74 5f 70 72 65 76 20 22 24 78 20 24   $pnt_prev "$x $
13bb0 79 22 5d 20 78 20 79 0d 0a 20 20 20 20 20 20 20  y"] x y..       
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 73 65 74 20 70 6e 74 5f 70 72 65 76      set pnt_prev
13bf0 20 22 24 78 20 24 79 22 0d 0a 20 20 20 20 20 20   "$x $y"..      
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
13c10 70 70 65 6e 64 20 64 4e 20 4c 20 7b 2a 7d 5b 66  ppend dN L {*}[f
13c20 6f 72 6d 61 74 20 22 25 2e 30 66 20 25 2e 30 66  ormat "%.0f %.0f
13c30 22 20 24 78 20 24 79 5d 0d 0a 20 20 20 20 20 20  " $x $y]..      
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
13c50 74 20 63 6d 64 5f 70 72 65 76 20 5b 73 74 72 69  t cmd_prev [stri
13c60 6e 67 20 74 6f 75 70 70 65 72 20 5b 6c 69 6e 64  ng toupper [lind
13c70 65 78 20 24 76 73 20 24 69 5d 5d 0d 0a 20 20 20  ex $vs $i]]..   
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 69 6e 63 72 20 69 20 31 0d 0a 20 20 20 20 20   incr i 1..     
13ca0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 20                z 
13cc0 2d 20 5a 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  - Z {..         
13cd0 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
13ce0 6e 64 20 64 4e 20 5b 6c 69 6e 64 65 78 20 24 76  nd dN [lindex $v
13cf0 73 20 24 69 5d 0d 0a 20 20 20 20 20 20 20 20 20  s $i]..         
13d00 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63             set c
13d10 6d 64 5f 70 72 65 76 20 5b 6c 69 6e 64 65 78 20  md_prev [lindex 
13d20 24 76 73 20 24 69 5d 0d 0a 20 20 20 20 20 20 20  $vs $i]..       
13d30 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13d40 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61              defa
13d50 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ult {..         
13d60 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 20             if { 
13d70 24 63 6d 64 5f 70 72 65 76 20 65 71 20 22 22 20  $cmd_prev eq "" 
13d80 7c 7c 20 24 63 6d 64 5f 70 72 65 76 20 69 6e 20  || $cmd_prev in 
13d90 22 4d 20 6d 22 20 7d 20 7b 0d 0a 20 20 20 20 20  "M m" } {..     
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 69 66 20 7b 20 24 63 6d 64 5f 70 72 65     if { $cmd_pre
13dc0 76 20 65 71 20 22 6d 22 20 7d 20 7b 0d 0a 20 20  v eq "m" } {..  
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6d            set cm
13df0 64 5f 70 72 65 76 20 22 6c 22 0d 0a 20 20 20 20  d_prev "l"..    
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6d            set cm
13e40 64 5f 70 72 65 76 20 22 4c 22 0d 0a 20 20 20 20  d_prev "L"..    
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e60 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
13e70 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 20 20 73 65 74 20 76 73 20 5b 6c 69 6e 73 65 72    set vs [linser
13ea0 74 20 24 76 73 20 24 69 20 24 63 6d 64 5f 70 72  t $vs $i $cmd_pr
13eb0 65 76 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ev]..           
13ec0 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 69 20           incr i 
13ed0 2d 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1..            
13ee0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
13ef0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
13f00 0a 20 20 20 20 20 20 20 20 0d 0a 20 20 20 20 20  .        ..     
13f10 20 20 20 73 65 74 20 65 6e 74 5f 74 79 70 65 20     set ent_type 
13f20 22 6c 69 6e 65 22 0d 0a 20 20 20 20 20 20 20 20  "line"..        
13f30 73 65 74 20 70 72 6f 70 73 20 22 70 3a 5b 6a 6f  set props "p:[jo
13f40 69 6e 20 24 64 4e 20 2c 5d 3b 22 0d 0a 20 20 20  in $dN ,];"..   
13f50 20 20 20 20 20 70 61 73 74 65 5f 65 6e 74 69 74       paste_entit
13f60 79 20 24 70 61 74 68 4e 6f 64 65 20 24 65 6e 74  y $pathNode $ent
13f70 5f 74 79 70 65 20 24 70 72 6f 70 73 20 24 74 65  _type $props $te
13f80 78 74 20 24 6d 54 20 73 74 79 6c 65 73 20 73 74  xt $mT styles st
13f90 79 6c 65 5f 6e 75 6d 0d 0a 20 20 20 20 7d 0d 0a  yle_num..    }..
13fa0 20 20 20 20 66 6f 72 65 61 63 68 20 63 69 72 63      foreach circ
13fb0 6c 65 4e 6f 64 65 20 5b 24 73 76 67 4e 6f 64 65  leNode [$svgNode
13fc0 20 73 6e 20 22 63 69 72 63 6c 65 22 5d 20 7b 0d   sn "circle"] {.
13fd0 0a 20 20 20 20 20 20 20 20 73 65 74 20 78 20 5b  .        set x [
13fe0 24 63 69 72 63 6c 65 4e 6f 64 65 20 40 63 78 20  $circleNode @cx 
13ff0 30 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  0]..        set 
14000 79 20 5b 24 63 69 72 63 6c 65 4e 6f 64 65 20 40  y [$circleNode @
14010 63 79 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 73  cy 0]..        s
14020 65 74 20 72 20 5b 24 63 69 72 63 6c 65 4e 6f 64  et r [$circleNod
14030 65 20 40 72 20 30 5d 0d 0a 20 20 20 20 20 20 20  e @r 0]..       
14040 20 6c 61 73 73 69 67 6e 20 5b 6d 3a 3a 6d 61 74   lassign [m::mat
14050 6d 75 6c 20 24 6d 20 22 24 78 20 24 79 20 31 22  mul $m "$x $y 1"
14060 5d 20 78 20 79 0d 0a 20 20 20 20 20 20 20 20 6c  ] x y..        l
14070 61 73 73 69 67 6e 20 5b 6d 3a 3a 6d 61 74 6d 75  assign [m::matmu
14080 6c 20 24 6d 53 20 22 24 72 20 30 22 5d 20 72 0d  l $mS "$r 0"] r.
14090 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 20 5b  .        set d [
140a0 65 78 70 72 20 7b 32 2a 24 72 7d 5d 0d 0a 20 20  expr {2*$r}]..  
140b0 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20        ..        
140c0 73 65 74 20 65 6e 74 5f 74 79 70 65 20 22 63 69  set ent_type "ci
140d0 72 63 6c 65 22 0d 0a 20 20 20 20 20 20 20 20 73  rcle"..        s
140e0 65 74 20 70 72 6f 70 73 20 22 70 3a 5b 66 6f 72  et props "p:[for
140f0 6d 61 74 20 22 25 2e 30 66 2c 25 2e 30 66 22 20  mat "%.0f,%.0f" 
14100 24 78 20 24 79 5d 3b 20 77 68 3a 5b 66 6f 72 6d  $x $y]; wh:[form
14110 61 74 20 22 25 2e 30 66 2c 25 2e 30 66 22 20 24  at "%.0f,%.0f" $
14120 64 20 24 64 5d 3b 22 0d 0a 20 20 20 20 20 20 20  d $d];"..       
14130 20 70 61 73 74 65 5f 65 6e 74 69 74 79 20 24 63   paste_entity $c
14140 69 72 63 6c 65 4e 6f 64 65 20 24 65 6e 74 5f 74  ircleNode $ent_t
14150 79 70 65 20 24 70 72 6f 70 73 20 24 74 65 78 74  ype $props $text
14160 20 24 6d 54 20 73 74 79 6c 65 73 20 73 74 79 6c   $mT styles styl
14170 65 5f 6e 75 6d 0d 0a 20 20 20 20 7d 20 20 20 20  e_num..    }    
14180 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 72 65  ..    foreach re
14190 63 74 4e 6f 64 65 20 5b 24 73 76 67 4e 6f 64 65  ctNode [$svgNode
141a0 20 73 6e 20 22 72 65 63 74 22 5d 20 7b 0d 0a 20   sn "rect"] {.. 
141b0 20 20 20 20 20 20 20 73 65 74 20 78 20 5b 24 72         set x [$r
141c0 65 63 74 4e 6f 64 65 20 40 78 20 30 5d 0d 0a 20  ectNode @x 0].. 
141d0 20 20 20 20 20 20 20 73 65 74 20 79 20 5b 24 72         set y [$r
141e0 65 63 74 4e 6f 64 65 20 40 79 20 30 5d 0d 0a 20  ectNode @y 0].. 
141f0 20 20 20 20 20 20 20 73 65 74 20 77 69 64 74 68         set width
14200 20 5b 24 72 65 63 74 4e 6f 64 65 20 40 77 69 64   [$rectNode @wid
14210 74 68 20 30 5d 0d 0a 20 20 20 20 20 20 20 20 73  th 0]..        s
14220 65 74 20 68 65 69 67 68 74 20 5b 24 72 65 63 74  et height [$rect
14230 4e 6f 64 65 20 40 68 65 69 67 68 74 20 30 5d 0d  Node @height 0].
14240 0a 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e  .        lassign
14250 20 5b 6d 3a 3a 6d 61 74 6d 75 6c 20 24 6d 20 22   [m::matmul $m "
14260 24 78 20 24 79 20 31 22 5d 20 78 20 79 0d 0a 20  $x $y 1"] x y.. 
14270 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 5b         lassign [
14280 6d 3a 3a 6d 61 74 6d 75 6c 20 24 6d 53 20 22 24  m::matmul $mS "$
14290 77 69 64 74 68 20 24 68 65 69 67 68 74 22 5d 20  width $height"] 
142a0 77 69 64 74 68 20 68 65 69 67 68 74 0d 0a 20 20  width height..  
142b0 20 20 20 20 20 20 0d 0a 20 20 20 20 20 20 20 20        ..        
142c0 73 65 74 20 65 6e 74 5f 74 79 70 65 20 22 72 65  set ent_type "re
142d0 63 74 22 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ct"..        set
142e0 20 70 72 6f 70 73 20 22 70 3a 5b 66 6f 72 6d 61   props "p:[forma
142f0 74 20 22 25 2e 30 66 2c 25 2e 30 66 22 20 24 78  t "%.0f,%.0f" $x
14300 20 24 79 5d 3b 20 61 3a 6e 77 3b 20 22 0d 0a 20   $y]; a:nw; ".. 
14310 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 70 72         append pr
14320 6f 70 73 20 22 77 68 3a 5b 66 6f 72 6d 61 74 20  ops "wh:[format 
14330 22 25 2e 30 66 2c 25 2e 30 66 22 20 24 77 69 64  "%.0f,%.0f" $wid
14340 74 68 20 24 68 65 69 67 68 74 5d 3b 22 0d 0a 20  th $height];".. 
14350 20 20 20 20 20 20 20 70 61 73 74 65 5f 65 6e 74         paste_ent
14360 69 74 79 20 24 72 65 63 74 4e 6f 64 65 20 24 65  ity $rectNode $e
14370 6e 74 5f 74 79 70 65 20 24 70 72 6f 70 73 20 24  nt_type $props $
14380 74 65 78 74 20 24 6d 54 20 73 74 79 6c 65 73 20  text $mT styles 
14390 73 74 79 6c 65 5f 6e 75 6d 0d 0a 20 20 20 20 7d  style_num..    }
143a0 0d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 74 65  ..    foreach te
143b0 78 74 4e 6f 64 65 20 5b 24 73 76 67 4e 6f 64 65  xtNode [$svgNode
143c0 20 73 6e 20 22 74 65 78 74 22 5d 20 7b 0d 0a 20   sn "text"] {.. 
143d0 20 20 20 20 20 20 20 73 65 74 20 78 20 5b 24 74         set x [$t
143e0 65 78 74 4e 6f 64 65 20 40 78 20 30 5d 0d 0a 20  extNode @x 0].. 
143f0 20 20 20 20 20 20 20 73 65 74 20 79 20 5b 24 74         set y [$t
14400 65 78 74 4e 6f 64 65 20 40 79 20 30 5d 0d 0a 20  extNode @y 0].. 
14410 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 5b         lassign [
14420 6d 3a 3a 6d 61 74 6d 75 6c 20 24 6d 20 22 24 78  m::matmul $m "$x
14430 20 24 79 20 31 22 5d 20 78 20 79 0d 0a 20 20 20   $y 1"] x y..   
14440 20 20 20 20 20 73 65 74 20 74 78 74 4c 69 73 74       set txtList
14450 20 22 22 0d 0a 20 20 20 20 20 20 20 20 66 6f 72   ""..        for
14460 65 61 63 68 20 6e 6f 64 65 20 5b 24 74 65 78 74  each node [$text
14470 4e 6f 64 65 20 73 6e 20 7b 74 73 70 61 6e 7d 5d  Node sn {tspan}]
14480 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14490 6c 61 70 70 65 6e 64 20 74 78 74 4c 69 73 74 20  lappend txtList 
144a0 5b 24 6e 6f 64 65 20 73 6e 20 73 74 72 69 6e 67  [$node sn string
144b0 28 2e 29 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  (.)]..        }.
144c0 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 78 74  .        set txt
144d0 20 5b 6a 6f 69 6e 20 24 74 78 74 4c 69 73 74 20   [join $txtList 
144e0 5c 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 0d 0a  \\n]..        ..
144f0 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 5f          set ent_
14500 74 79 70 65 20 22 74 65 78 74 22 0d 0a 20 20 20  type "text"..   
14510 20 20 20 20 20 73 65 74 20 70 72 6f 70 73 20 22       set props "
14520 70 3a 5b 66 6f 72 6d 61 74 20 22 25 2e 30 66 2c  p:[format "%.0f,
14530 25 2e 30 66 22 20 24 78 20 24 79 5d 3b 20 61 3a  %.0f" $x $y]; a:
14540 77 3b 20 22 0d 0a 20 20 20 20 20 20 20 20 61 70  w; "..        ap
14550 70 65 6e 64 20 70 72 6f 70 73 20 22 74 3a 24 74  pend props "t:$t
14560 78 74 3b 22 0d 0a 20 20 20 20 20 20 20 20 70 61  xt;"..        pa
14570 73 74 65 5f 65 6e 74 69 74 79 20 24 74 65 78 74  ste_entity $text
14580 4e 6f 64 65 20 24 65 6e 74 5f 74 79 70 65 20 24  Node $ent_type $
14590 70 72 6f 70 73 20 24 74 65 78 74 20 24 6d 54 20  props $text $mT 
145a0 73 74 79 6c 65 73 20 73 74 79 6c 65 5f 6e 75 6d  styles style_num
145b0 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 0d 0a 20  ..    }..    .. 
145c0 20 20 20 64 69 63 74 20 66 6f 72 20 22 6e 20 76     dict for "n v
145d0 22 20 5b 64 69 63 74 5f 67 65 74 64 20 24 73 74  " [dict_getd $st
145e0 79 6c 65 73 20 6e 20 22 22 5d 20 7b 0d 0a 20 20  yles n ""] {..  
145f0 20 20 20 20 20 20 24 74 65 78 74 20 69 6e 73 65        $text inse
14600 72 74 20 69 6e 73 65 72 74 20 22 2e 24 6e 20 24  rt insert ".$n $
14610 76 5c 6e 22 0d 0a 20 20 20 20 7d 0d 0a 20 20 20  v\n"..    }..   
14620 20 69 66 20 7b 20 21 24 66 6f 75 6e 64 5f 73 74   if { !$found_st
14630 61 72 74 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20  art } {..       
14640 20 24 74 65 78 74 20 69 6e 73 65 72 74 20 69 6e   $text insert in
14650 73 65 72 74 20 22 7e 7e 7e 7e 5c 6e 22 0d 0a 20  sert "~~~~\n".. 
14660 20 20 20 7d 0d 0a 7d 0d 0a 0d 0a 70 72 6f 63 20     }..}....proc 
14670 73 76 67 6d 6c 3a 3a 63 72 65 61 74 65 5f 66 69  svgml::create_fi
14680 6c 65 20 7b 20 61 72 67 73 20 7d 20 7b 0d 0a 20  le { args } {.. 
14690 20 20 20 76 61 72 69 61 62 6c 65 20 73 76 67 66     variable svgf
146a0 69 6c 65 0d 0a 20 20 20 20 0d 0a 20 20 20 20 73  ile..    ..    s
146b0 65 74 20 6f 70 74 69 6f 6e 61 6c 20 7b 0d 0a 20  et optional {.. 
146c0 20 20 20 20 20 20 20 7b 20 2d 66 69 6c 65 20 73         { -file s
146d0 76 67 66 69 6c 65 20 22 22 20 7d 0d 0a 20 20 20  vgfile "" }..   
146e0 20 20 20 20 20 7b 20 2d 69 6e 6b 73 63 61 70 65       { -inkscape
146f0 20 22 22 20 30 20 7d 0d 0a 20 20 20 20 20 20 20   "" 0 }..       
14700 20 7b 20 2d 73 61 6d 65 66 69 6c 65 20 22 22 20   { -samefile "" 
14710 30 20 7d 0d 0a 20 20 20 20 20 20 20 20 7b 20 2d  0 }..        { -
14720 6f 70 65 6e 20 22 22 20 30 20 7d 0d 0a 20 20 20  open "" 0 }..   
14730 20 7d 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 70   }..    set comp
14740 75 6c 73 6f 72 79 20 22 74 78 74 22 0d 0a 20 20  ulsory "txt"..  
14750 20 20 70 61 72 73 65 5f 61 72 67 73 20 24 6f 70    parse_args $op
14760 74 69 6f 6e 61 6c 20 24 63 6f 6d 70 75 6c 73 6f  tional $compulso
14770 72 79 20 24 61 72 67 73 0d 0a 20 20 20 20 20 20  ry $args..      
14780 20 20 0d 0a 20 20 20 20 73 65 74 20 78 6d 6c 20    ..    set xml 
14790 5b 63 72 65 61 74 65 20 24 74 78 74 5d 0d 0a 20  [create $txt].. 
147a0 20 20 20 0d 0a 20 20 20 20 69 66 20 7b 20 24 66     ..    if { $f
147b0 69 6c 65 20 6e 65 20 22 22 20 7d 20 7b 0d 0a 20  ile ne "" } {.. 
147c0 20 20 20 20 20 20 20 73 65 74 20 73 76 67 66 69         set svgfi
147d0 6c 65 20 24 66 69 6c 65 0d 0a 20 20 20 20 7d 20  le $file..    } 
147e0 65 6c 73 65 69 66 20 7b 20 24 73 61 6d 65 66 69  elseif { $samefi
147f0 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  le } {..        
14800 63 6c 6f 73 65 20 5b 66 69 6c 65 20 74 65 6d 70  close [file temp
14810 66 69 6c 65 20 74 6d 70 5d 0d 0a 20 20 20 20 20  file tmp]..     
14820 20 20 20 73 65 74 20 73 76 67 66 69 6c 65 20 5b     set svgfile [
14830 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 6d  file dirname $tm
14840 70 5d 2f 74 65 73 74 66 69 6c 65 2e 73 76 67 0d  p]/testfile.svg.
14850 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20  .    } else {.. 
14860 20 20 20 20 20 20 20 63 6c 6f 73 65 20 5b 66 69         close [fi
14870 6c 65 20 74 65 6d 70 66 69 6c 65 20 74 6d 70 5d  le tempfile tmp]
14880 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 76  ..        set sv
14890 67 66 69 6c 65 20 5b 66 69 6c 65 20 72 6f 6f 74  gfile [file root
148a0 20 24 74 6d 70 5d 2e 73 76 67 0d 0a 20 20 20 20   $tmp].svg..    
148b0 7d 0d 0a 20 20 20 20 66 69 6c 65 20 6d 6b 64 69  }..    file mkdi
148c0 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
148d0 24 73 76 67 66 69 6c 65 5d 0d 0a 20 20 20 20 0d  $svgfile]..    .
148e0 0a 20 20 20 20 73 65 74 20 77 72 69 74 65 20 31  .    set write 1
148f0 0d 0a 20 20 20 20 69 66 20 7b 20 5b 66 69 6c 65  ..    if { [file
14900 20 65 78 69 73 74 73 20 24 73 76 67 66 69 6c 65   exists $svgfile
14910 5d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  ] } {..        s
14920 65 74 20 66 69 6e 20 5b 6f 70 65 6e 20 20 24 73  et fin [open  $s
14930 76 67 66 69 6c 65 20 72 5d 0d 0a 20 20 20 20 20  vgfile r]..     
14940 20 20 20 73 65 74 20 64 61 74 61 20 5b 72 65 61     set data [rea
14950 64 20 24 66 69 6e 5d 0d 0a 20 20 20 20 20 20 20  d $fin]..       
14960 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 69 6e   fconfigure $fin
14970 20 2d 65 6e 63 6f 64 69 6e 67 20 75 74 66 2d 38   -encoding utf-8
14980 0d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 20  ..        close 
14990 24 66 69 6e 0d 0a 20 20 20 20 20 20 20 20 69 66  $fin..        if
149a0 20 7b 20 24 64 61 74 61 20 65 71 20 24 78 6d 6c   { $data eq $xml
149b0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20   } {..          
149c0 20 20 73 65 74 20 77 72 69 74 65 20 30 0d 0a 20    set write 0.. 
149d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d         }..    }.
149e0 0a 20 20 20 20 69 66 20 7b 20 24 77 72 69 74 65  .    if { $write
149f0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65   } {..        se
14a00 74 20 66 6f 75 74 20 5b 6f 70 65 6e 20 24 73 76  t fout [open $sv
14a10 67 66 69 6c 65 20 77 5d 0d 0a 20 20 20 20 20 20  gfile w]..      
14a20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 6f    fconfigure $fo
14a30 75 74 20 2d 65 6e 63 6f 64 69 6e 67 20 75 74 66  ut -encoding utf
14a40 2d 38 0d 0a 20 20 20 20 20 20 20 20 70 75 74 73  -8..        puts
14a50 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 6f 75   -nonewline $fou
14a60 74 20 24 78 6d 6c 0d 0a 20 20 20 20 20 20 20 20  t $xml..        
14a70 63 6c 6f 73 65 20 24 66 6f 75 74 0d 0a 20 20 20  close $fout..   
14a80 20 7d 0d 0a 20 20 20 20 69 66 20 7b 20 24 6f 70   }..    if { $op
14a90 65 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  en } {..        
14aa0 69 66 20 7b 20 21 24 69 6e 6b 73 63 61 70 65 20  if { !$inkscape 
14ab0 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
14ac0 20 63 75 3a 3a 66 69 6c 65 3a 3a 65 78 65 63 75   cu::file::execu
14ad0 74 65 20 73 74 61 72 74 20 24 73 76 67 66 69 6c  te start $svgfil
14ae0 65 20 26 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  e &..        } e
14af0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
14b00 20 20 20 63 75 3a 3a 66 69 6c 65 3a 3a 65 78 65     cu::file::exe
14b10 63 75 74 65 20 65 78 65 63 20 69 6e 6b 73 63 61  cute exec inksca
14b20 70 65 20 24 73 76 67 66 69 6c 65 20 26 0d 0a 20  pe $svgfile &.. 
14b30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d         }..    }.
14b40 0a 20 20 20 20 23 20 70 75 74 73 20 73 76 67 66  .    # puts svgf
14b50 69 6c 65 3d 24 73 76 67 66 69 6c 65 0d 0a 7d 0d  ile=$svgfile..}.
14b60 0a 0d 0a 23 20 55 2b 30 33 39 34 20 47 72 65 65  ...# U+0394 Gree
14b70 6b 20 43 61 70 69 74 61 6c 20 4c 65 74 74 65 72  k Capital Letter
14b80 20 44 65 6c 74 61 20 55 6e 69 63 6f 64 65 20 43   Delta Unicode C
14b90 68 61 72 61 63 74 65 72 0d 0a 0d 0a 73 65 74 20  haracter....set 
14ba0 74 78 74 20 7b 0d 0a 20 20 20 20 2b 73 76 67 6d  txt {..    +svgm
14bb0 6c 31 20 20 20 20 20 20 20 20 20 20 20 20 20 77  l1             w
14bc0 69 64 74 68 3a 39 30 30 3b 20 68 65 69 67 68 74  idth:900; height
14bd0 3a 34 30 25 3b 0d 0a 20 20 20 20 2b 61 6c 69 61  :40%;..    +alia
14be0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  s              p
14bf0 6f 69 6e 74 3a 70 3b 20 64 65 6c 74 61 2d 70 6f  oint:p; delta-po
14c00 69 6e 74 3a 64 70 3b 20 77 69 64 74 68 2d 68 65  int:dp; width-he
14c10 69 67 68 74 3a 77 68 3b 20 74 65 78 74 3a 74 3b  ight:wh; text:t;
14c20 0d 0a 20 20 20 20 2b 61 6c 69 61 73 20 20 20 20  ..    +alias    
14c30 20 20 20 20 20 20 20 20 20 20 61 6e 63 68 6f 72            anchor
14c40 3a 61 3b 20 68 6f 72 69 7a 6f 6e 74 61 6c 2d 76  :a; horizontal-v
14c50 65 72 74 69 63 61 6c 3a 68 76 3b 20 63 6c 61 73  ertical:hv; clas
14c60 73 3a 63 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20  s:cl;..         
14c70 0d 0a 20 20 20 20 64 65 62 20 20 20 20 20 20 20  ..    deb       
14c80 20 20 20 20 20 20 20 20 20 20 72 65 63 74 20 20            rect  
14c90 20 20 20 20 70 3a 30 2c 30 3b 20 70 3a 31 30 30      p:0,0; p:100
14ca0 2c 31 30 30 3b 20 63 6c 3a 6c 69 6e 65 2d 64 65  ,100; cl:line-de
14cb0 62 75 67 3b 0d 0a 20 20 20 20 23 52 31 2e 64 65  bug;..    #R1.de
14cc0 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  b              r
14cd0 65 63 74 20 20 20 20 20 20 70 3a 30 2c 30 3b 20  ect      p:0,0; 
14ce0 70 3a 31 30 30 2c 31 30 30 3b 20 63 6c 3a 6c 69  p:100,100; cl:li
14cf0 6e 65 2d 64 65 62 75 67 3b 0d 0a 20 20 20 20 23  ne-debug;..    #
14d00 64 65 62 54 20 20 20 20 20 20 20 20 20 20 20 20  debT            
14d10 20 20 20 20 72 65 63 74 20 20 20 20 20 20 70 3a      rect      p:
14d20 35 30 2c 31 30 3b 20 20 77 68 3a 36 30 2c 38 3b  50,10;  wh:60,8;
14d30 20 61 3a 73 3b 20 63 6c 3a 6c 69 6e 65 2d 64 65   a:s; cl:line-de
14d40 62 75 67 3b 0d 0a 20 20 20 20 20 20 20 20 20 0d  bug;..         .
14d50 0a 20 20 20 20 74 69 74 6c 65 20 20 20 20 20 20  .    title      
14d60 20 20 20 20 20 20 20 20 20 74 65 78 74 20 20 20           text   
14d70 20 20 20 70 3a 35 30 2c 31 30 3b 20 20 74 3a 3a     p:50,10;  t::
14d80 54 49 54 4c 45 3b 20 61 3a 73 3b 20 63 6c 3a 74  TITLE; a:s; cl:t
14d90 65 78 74 54 49 54 4c 45 3b 0d 0a 20 20 20 20 52  extTITLE;..    R
14da0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
14db0 20 20 20 72 65 67 69 6f 6e 20 20 20 20 70 3a 32     region    p:2
14dc0 35 2c 35 30 3b 20 20 77 68 3a 33 35 2c 39 30 3b  5,50;  wh:35,90;
14dd0 20 61 3a 6e 73 65 77 3b 0d 0a 20 20 20 20 52 31   a:nsew;..    R1
14de0 2e 62 6f 78 20 20 20 20 20 20 20 20 20 20 20 20  .box            
14df0 20 20 72 65 63 74 20 20 20 20 20 20 70 3a 35 30    rect      p:50
14e00 2c 34 30 3b 20 20 77 68 3a 36 35 2c 33 30 3b 20  ,40;  wh:65,30; 
14e10 61 3a 6e 73 65 77 3b 20 63 6c 3a 72 6f 75 6e 64  a:nsew; cl:round
14e20 65 64 5f 62 6f 78 3b 0d 0a 20 20 20 20 52 31 2e  ed_box;..    R1.
14e30 62 6f 78 2e 6c 79 67 20 20 20 20 20 20 20 20 20  box.lyg         
14e40 20 6c 69 6e 65 20 20 20 20 20 20 70 3a 2d 31 30   line      p:-10
14e50 2c 39 30 3b 20 70 3a 31 31 30 2c 39 30 3b 20 63  ,90; p:110,90; c
14e60 6c 3a 6c 69 6e 65 31 3b 0d 0a 20 20 20 20 52 31  l:line1;..    R1
14e70 2e 62 6f 78 2e 6c 79 67 2e 6c 31 20 20 20 20 20  .box.lyg.l1     
14e80 20 20 6c 61 62 65 6c 20 20 20 20 20 70 3a 30 2c    label     p:0,
14e90 31 30 30 3b 20 20 74 3a 79 7e 67 7e 3b 20 61 3a  100;  t:y~g~; a:
14ea0 73 65 3b 20 63 6c 3a 74 65 78 74 31 3b 0d 0a 20  se; cl:text1;.. 
14eb0 20 20 20 52 31 2e 62 6f 78 2e 78 30 79 30 20 20     R1.box.x0y0  
14ec0 20 20 20 20 20 20 20 6c 61 62 65 6c 20 20 20 20         label    
14ed0 20 70 3a 30 2c 31 30 30 3b 20 20 20 74 3a 78 7e   p:0,100;   t:x~
14ee0 30 7e 2c 79 7e 30 7e 3b 20 61 3a 6e 65 3b 20 63  0~,y~0~; a:ne; c
14ef0 6c 3a 74 65 78 74 31 3b 0d 0a 20 20 20 20 52 31  l:text1;..    R1
14f00 2e 62 6f 78 2e 64 69 6d 78 20 20 20 20 20 20 20  .box.dimx       
14f10 20 20 64 69 6d 65 6e 73 69 6f 6e 20 61 72 69 73    dimension aris
14f20 74 65 3a 73 3b 20 61 3a 6e 3b 20 74 3a 5c 75 30  te:s; a:n; t:\u0
14f30 33 39 34 78 3b 20 63 6c 3a 74 65 78 74 31 3b 0d  394x; cl:text1;.
14f40 0a 20 20 20 20 52 31 2e 62 6f 78 2e 64 69 6d 79  .    R1.box.dimy
14f50 20 20 20 20 20 20 20 20 20 64 69 6d 65 6e 73 69           dimensi
14f60 6f 6e 20 61 72 69 73 74 65 3a 65 3b 20 61 3a 77  on ariste:e; a:w
14f70 3b 20 74 3a 5c 75 30 33 39 34 79 3b 20 63 6c 3a  ; t:\u0394y; cl:
14f80 74 65 78 74 31 3b 0d 0a 20 20 20 20 23 52 31 2e  text1;..    #R1.
14f90 62 6f 78 2e 74 78 74 20 20 20 20 20 20 20 20 20  box.txt         
14fa0 20 74 65 78 74 20 20 20 20 20 20 70 3a 32 2c 38   text      p:2,8
14fb0 30 3b 20 20 20 74 3a 61 63 42 6a 3b 20 63 6c 3a  0;   t:acBj; cl:
14fc0 74 65 78 74 69 6e 74 3b 0d 0a 20 20 20 20 52 31  textint;..    R1
14fd0 2e 74 64 65 73 63 20 20 20 20 20 20 20 20 20 20  .tdesc          
14fe0 20 20 74 65 78 74 20 20 20 20 20 20 70 3a 31 30    text      p:10
14ff0 2c 38 30 3b 20 61 3a 73 77 3b 20 74 3a 3a 42 44  ,80; a:sw; t::BD
15000 45 53 43 3b 20 63 6c 3a 74 65 78 74 44 45 53 43  ESC; cl:textDESC
15010 3b 0d 0a 20 20 20 20 20 20 20 20 20 0d 0a 20 20  ;..         ..  
15020 20 20 52 32 20 20 20 20 20 20 20 20 20 20 20 20    R2            
15030 20 20 20 20 20 20 72 65 67 69 6f 6e 20 20 20 20        region    
15040 70 3a 37 35 2c 35 30 3b 20 20 77 68 3a 33 35 2c  p:75,50;  wh:35,
15050 39 30 3b 20 61 3a 6e 73 65 77 3b 0d 0a 20 20 20  90; a:nsew;..   
15060 20 52 32 2e 62 6f 78 20 20 20 20 20 20 20 20 20   R2.box         
15070 20 20 20 20 20 72 65 63 74 20 20 20 20 20 20 70       rect      p
15080 3a 35 30 2c 34 30 3b 20 20 77 68 3a 36 35 2c 33  :50,40;  wh:65,3
15090 30 3b 20 61 3a 6e 73 65 77 3b 20 63 6c 3a 72 6f  0; a:nsew; cl:ro
150a0 75 6e 64 65 64 5f 62 6f 78 3b 0d 0a 20 20 20 20  unded_box;..    
150b0 52 32 2e 62 6f 78 2e 6c 79 67 20 20 20 20 20 20  R2.box.lyg      
150c0 20 20 20 20 6c 69 6e 65 20 20 20 20 20 20 70 3a      line      p:
150d0 2d 31 30 2c 39 30 3b 20 70 3a 31 31 30 2c 39 30  -10,90; p:110,90
150e0 3b 20 63 6c 3a 6c 69 6e 65 31 3b 0d 0a 20 20 20  ; cl:line1;..   
150f0 20 52 32 2e 62 6f 78 2e 6c 79 67 2e 6c 31 20 20   R2.box.lyg.l1  
15100 20 20 20 20 20 6c 61 62 65 6c 20 20 20 20 20 70       label     p
15110 3a 30 2c 31 30 30 3b 20 20 74 3a 79 7e 67 2c 70  :0,100;  t:y~g,p
15120 7e 3b 20 61 3a 73 65 3b 20 63 6c 3a 74 65 78 74  ~; a:se; cl:text
15130 31 3b 0d 0a 20 20 20 20 52 32 2e 62 6f 78 2e 78  1;..    R2.box.x
15140 30 79 30 20 20 20 20 20 20 20 20 20 6c 61 62 65  0y0         labe
15150 6c 20 20 20 20 20 70 3a 30 2c 31 30 30 3b 20 20  l     p:0,100;  
15160 74 3a 78 7e 30 2c 70 7e 2c 79 7e 30 2c 70 7e 3b  t:x~0,p~,y~0,p~;
15170 20 61 3a 6e 65 3b 20 63 6c 3a 74 65 78 74 31 3b   a:ne; cl:text1;
15180 0d 0a 20 20 20 20 52 32 2e 62 6f 78 2e 62 6f 78  ..    R2.box.box
15190 69 6e 20 20 20 20 20 20 20 20 72 65 63 74 20 20  in        rect  
151a0 20 20 20 20 70 3a 39 32 2c 31 30 3b 20 20 77 68      p:92,10;  wh
151b0 3a 36 30 2c 34 30 3b 20 61 3a 6e 65 3b 20 63 6c  :60,40; a:ne; cl
151c0 3a 72 6f 75 6e 64 65 64 5f 62 6f 78 3b 0d 0a 20  :rounded_box;.. 
151d0 20 20 20 52 32 2e 62 6f 78 2e 62 6f 78 69 6e 2e     R2.box.boxin.
151e0 6c 79 67 20 20 20 20 6c 69 6e 65 20 20 20 20 20  lyg    line     
151f0 20 70 3a 2d 31 30 2c 38 30 3b 20 70 3a 31 31 30   p:-10,80; p:110
15200 2c 38 30 3b 20 63 6c 3a 6c 69 6e 65 31 3b 0d 0a  ,80; cl:line1;..
15210 20 20 20 20 52 32 2e 62 6f 78 2e 62 6f 78 69 6e      R2.box.boxin
15220 2e 6c 79 67 2e 6c 31 20 6c 61 62 65 6c 20 20 20  .lyg.l1 label   
15230 20 20 70 3a 30 2c 31 30 30 3b 20 20 74 3a 79 7e    p:0,100;  t:y~
15240 67 7e 3b 20 61 3a 73 65 3b 20 63 6c 3a 74 65 78  g~; a:se; cl:tex
15250 74 31 3b 0d 0a 20 20 20 20 52 32 2e 62 6f 78 2e  t1;..    R2.box.
15260 64 69 6d 78 20 20 20 20 20 20 20 20 20 64 69 6d  dimx         dim
15270 65 6e 73 69 6f 6e 20 70 3a 30 2c 31 30 30 3b 20  ension p:0,100; 
15280 20 70 3a 23 52 32 2e 62 6f 78 2e 62 6f 78 69 6e   p:#R2.box.boxin
15290 2c 30 2c 31 30 30 3b 20 68 76 3a 68 3b 20 61 3a  ,0,100; hv:h; a:
152a0 6e 3b 20 74 3a 78 7e 30 7e 3b 20 63 6c 3a 74 65  n; t:x~0~; cl:te
152b0 78 74 31 3b 0d 0a 20 20 20 20 52 32 2e 62 6f 78  xt1;..    R2.box
152c0 2e 64 69 6d 31 20 20 20 20 20 20 20 20 20 64 69  .dim1         di
152d0 6d 65 6e 73 69 6f 6e 20 70 3a 23 52 32 2e 62 6f  mension p:#R2.bo
152e0 78 2e 6c 79 67 2c 31 30 30 2c 30 3b 20 20 70 3a  x.lyg,100,0;  p:
152f0 23 52 32 2e 62 6f 78 2e 62 6f 78 69 6e 2c 31 30  #R2.box.boxin,10
15300 30 2c 31 30 30 3b 20 68 76 3a 76 3b 20 61 3a 77  0,100; hv:v; a:w
15310 3b 20 74 3a 79 7e 30 7e 3b 20 63 6c 3a 74 65 78  ; t:y~0~; cl:tex
15320 74 31 3b 0d 0a 20 20 20 20 52 32 2e 62 6f 78 2e  t1;..    R2.box.
15330 64 69 6d 32 20 20 20 20 20 20 20 20 20 64 69 6d  dim2         dim
15340 65 6e 73 69 6f 6e 20 70 3a 23 52 32 2e 62 6f 78  ension p:#R2.box
15350 2e 6c 79 67 2c 31 30 30 2c 30 3b 20 20 70 3a 23  .lyg,100,0;  p:#
15360 52 32 2e 62 6f 78 2e 62 6f 78 69 6e 2e 6c 79 67  R2.box.boxin.lyg
15370 2c 31 30 30 2c 30 3b 20 68 76 3a 76 3b 20 61 3a  ,100,0; hv:v; a:
15380 77 3b 20 74 3a 79 7e 67 7e 3b 20 64 70 3a 33 30  w; t:y~g~; dp:30
15390 2c 30 3b 20 63 6c 3a 74 65 78 74 31 3b 0d 0a 20  ,0; cl:text1;.. 
153a0 20 20 20 52 32 2e 74 64 65 73 63 20 20 20 20 20     R2.tdesc     
153b0 20 20 20 20 20 20 20 74 65 78 74 20 20 20 20 20         text     
153c0 20 70 3a 31 30 2c 38 30 3b 20 61 3a 73 77 3b 20   p:10,80; a:sw; 
153d0 74 3a 3a 42 44 45 53 43 50 3b 20 63 6c 3a 74 65  t::BDESCP; cl:te
153e0 78 74 44 45 53 43 3b 0d 0a 20 20 20 20 0d 0a 20  xtDESC;..    .. 
153f0 20 20 20 2e 72 6f 75 6e 64 65 64 5f 62 6f 78 20     .rounded_box 
15400 20 20 62 6f 72 64 65 72 2d 72 61 64 69 75 73 3a    border-radius:
15410 20 35 70 78 3b 20 73 74 72 6f 6b 65 2d 77 69 64   5px; stroke-wid
15420 74 68 3a 20 33 70 78 3b 20 73 74 72 6f 6b 65 3a  th: 3px; stroke:
15430 20 6f 72 61 6e 67 65 3b 20 66 69 6c 6c 3a 20 79   orange; fill: y
15440 65 6c 6c 6f 77 3b 0d 0a 20 20 20 20 2e 6c 69 6e  ellow;..    .lin
15450 65 31 20 20 20 20 20 20 20 20 20 73 74 72 6f 6b  e1         strok
15460 65 2d 77 69 64 74 68 3a 20 32 70 78 3b 20 73 74  e-width: 2px; st
15470 72 6f 6b 65 3a 20 6f 72 61 6e 67 65 3b 20 66 69  roke: orange; fi
15480 6c 6c 3a 6e 6f 6e 65 3b 0d 0a 20 20 20 20 2e 6c  ll:none;..    .l
15490 69 6e 65 2d 64 65 62 75 67 20 20 20 20 73 74 72  ine-debug    str
154a0 6f 6b 65 2d 77 69 64 74 68 3a 20 31 70 78 3b 20  oke-width: 1px; 
154b0 73 74 72 6f 6b 65 3a 20 72 65 64 3b 20 66 69 6c  stroke: red; fil
154c0 6c 3a 6e 6f 6e 65 3b 20 73 74 72 6f 6b 65 2d 64  l:none; stroke-d
154d0 61 73 68 61 72 72 61 79 3a 20 35 20 35 3b 0d 0a  asharray: 5 5;..
154e0 20 20 20 20 2e 74 65 78 74 54 49 54 4c 45 20 20      .textTITLE  
154f0 20 20 20 66 6f 6e 74 2d 73 69 7a 65 3a 20 32 34     font-size: 24
15500 70 78 3b 20 66 69 6c 6c 3a 20 23 30 38 30 30 64  px; fill: #0800d
15510 38 3b 20 73 74 72 6f 6b 65 3a 23 35 38 35 38 35  8; stroke:#58585
15520 38 3b 20 73 74 72 6f 6b 65 2d 77 69 64 74 68 3a  8; stroke-width:
15530 30 20 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 73  0 font-family: s
15540 61 6e 73 2d 73 65 72 69 66 3b 20 74 65 78 74 2d  ans-serif; text-
15550 64 65 63 6f 72 61 74 69 6f 6e 3a 20 75 6e 64 65  decoration: unde
15560 72 6c 69 6e 65 3b 0d 0a 20 20 20 20 2e 74 65 78  rline;..    .tex
15570 74 44 45 53 43 20 20 20 20 20 20 66 6f 6e 74 2d  tDESC      font-
15580 73 69 7a 65 3a 20 31 36 70 78 3b 20 66 69 6c 6c  size: 16px; fill
15590 3a 20 62 6c 61 63 6b 3b 20 66 6f 6e 74 2d 66 61  : black; font-fa
155a0 6d 69 6c 79 3a 20 73 61 6e 73 2d 73 65 72 69 66  mily: sans-serif
155b0 3b 0d 0a 20 20 20 20 2e 74 65 78 74 69 6e 74 20  ;..    .textint 
155c0 20 20 20 20 20 20 66 6f 6e 74 2d 73 69 7a 65 3a        font-size:
155d0 20 33 36 70 78 3b 20 66 69 6c 6c 3a 20 62 6c 61   36px; fill: bla
155e0 63 6b 3b 20 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a  ck; font-family:
155f0 20 73 61 6e 73 2d 73 65 72 69 66 3b 0d 0a 20 20   sans-serif;..  
15600 20 20 2e 74 65 78 74 31 20 20 20 20 20 20 20 20    .text1        
15610 20 66 6f 6e 74 2d 73 69 7a 65 3a 20 31 38 70 78   font-size: 18px
15620 3b 20 66 69 6c 6c 3a 20 62 6c 61 63 6b 3b 20 66  ; fill: black; f
15630 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 73 61 6e 73  ont-family: sans
15640 2d 73 65 72 69 66 3b 0d 0a 20 20 20 20 0d 0a 20  -serif;..    .. 
15650 20 20 20 2b 76 61 72 69 61 62 6c 65 73 20 20 20     +variables   
15660 20 20 54 49 54 4c 45 3a 42 6f 78 65 73 20 64 65    TITLE:Boxes de
15670 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 63 61 6c  finition for cal
15680 63 75 6c 61 74 69 6e 67 20 48 54 4d 4c 20 64 69  culating HTML di
15690 73 70 6c 61 79 3b 0d 0a 20 20 20 20 2b 76 61 72  splay;..    +var
156a0 69 61 62 6c 65 73 20 20 20 20 20 42 44 45 53 43  iables     BDESC
156b0 3a 2a 2a 62 6f 78 2a 2a 3d 5b 78 7e 30 7e 2c 79  :**box**=[x~0~,y
156c0 7e 30 7e 2c 5c 75 30 33 39 34 78 2c 5c 75 30 33  ~0~,\u0394x,\u03
156d0 39 34 79 5d 5c 6e 2a 2a 62 6f 78 7e 30 7e 2a 2a  94y]\n**box~0~**
156e0 3d 5b 30 2c 30 2c 50 61 67 65 7e 77 69 64 74 68  =[0,0,Page~width
156f0 7e 2c 50 61 67 65 7e 68 65 69 67 68 74 7e 5d 3b  ~,Page~height~];
15700 0d 0a 20 20 20 20 2b 76 61 72 69 61 62 6c 65 73  ..    +variables
15710 20 20 20 20 20 42 44 45 53 43 50 3a 20 2a 2a 78       BDESCP: **x
15720 7e 30 7e 2c 20 79 7e 30 7e 2a 2a 20 61 6e 64 20  ~0~, y~0~** and 
15730 2a 2a 79 7e 67 7e 2a 2a 20 76 61 6c 75 65 73 20  **y~g~** values 
15740 61 72 65 20 72 65 6c 61 74 69 76 65 20 5c 6e 20  are relative \n 
15750 74 6f 20 70 61 72 65 6e 74 20 2a 2a 78 7e 30 2c  to parent **x~0,
15760 70 7e 2c 20 79 7e 67 2c 70 7e 2a 2a 5c 6e 3b 0d  p~, y~g,p~**\n;.
15770 0a 20 20 20 20 2b 76 61 72 69 61 62 6c 65 73 20  .    +variables 
15780 20 20 20 20 2b 42 44 45 53 43 50 3a 20 2a 2a 5c      +BDESCP: **\
15790 75 30 33 39 34 78 2c 5c 75 30 33 39 34 79 2a 2a  u0394x,\u0394y**
157a0 20 61 72 65 20 69 6e 20 74 68 65 20 73 61 6d 65   are in the same
157b0 20 73 63 61 6c 65 20 74 68 61 6e 20 2a 2a 5c 75   scale than **\u
157c0 30 33 39 34 78 7e 70 7e 2c 5c 75 30 33 39 34 79  0394x~p~,\u0394y
157d0 7e 70 7e 2a 2a 3b 0d 0a 7d 0d 0a 0d 0a 69 66 20  ~p~**;..}....if 
157e0 30 20 7b 0d 0a 20 20 20 20 73 76 67 6d 6c 3a 3a  0 {..    svgml::
157f0 63 72 65 61 74 65 5f 66 69 6c 65 20 2d 6f 70 65  create_file -ope
15800 6e 20 24 74 78 74 0d 0a 23 73 76 67 6d 6c 3a 3a  n $txt..#svgml::
15810 63 72 65 61 74 65 5f 66 69 6c 65 20 2d 69 6e 6b  create_file -ink
15820 73 63 61 70 65 20 24 74 78 74 0d 0a 23 73 76 67  scape $txt..#svg
15830 6d 6c 3a 3a 63 72 65 61 74 65 5f 66 69 6c 65 20  ml::create_file 
15840 2d 73 61 6d 65 66 69 6c 65 20 2d 6f 70 65 6e 3d  -samefile -open=
15850 30 20 24 74 78 74 0d 0a 0d 0a 65 78 69 74 0d 0a  0 $txt....exit..
15860 7d 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d  }...............
15870 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d  ................
15880 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d 0a 0d  ................
15890 0a 0d 0a                                         ...