Require Class/basicTube

basicTube Subclass Tube {
  Var "domain {[basicTube get domain]}"
  Method <Domain> {domain} {set [var domain] $domain}
  ClassVar "Domain-template {{[basicTube get domain]}}"

  Var "tube-r {[basicTube get tube-r]}"
  Method <Radius> {r} {set [var tube-r] $r}
  ClassVar "Radius-template {[basicTube get tube-r]}"

  Var tube-f {frame 1}
  Method <Tube> {uv script args} {
    global errorCode errorInfo
    if [set code [catch [list _bind(Rest) {} {{frame ""} {absolute ""}} $args \
        [Self method <Tube>]] err]] \
	{return -code $code -errorcode $errorCode -errorinfo $errorInfo $err}
    if {[llength $uv] != 1 && [llength $uv] != 2} \
      {Error "Tube function must be of one or two variables"}
    set [var sf-uv] $uv
    set [var tube-f] $script
    if {$absolute != ""} {set [var frame] 0} else {set [var frame] 1}
  }
  ClassVar {Tube-template {{theta} {cos(theta) sin(theta)}}}

  ClassVar {script-templates {Domain Radius Tube}}

  Method ScriptBegin {} {
    Vars domain frame sf-uv tube-f tube-r
    Parent ScriptBegin
    set domain [Parent get domain]
    set frame [Parent get frame]
    set sf-uv [Parent get sf-uv]
    set tube-r [Parent get tube-r]
    set tube-f {0 0}
  }

  Method ScriptEnd {} {Parent ScriptEnd; Self SetUV}
}

Tube Register
