Require Class/basicSurfaceOfRevolution

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

  Var "uv {[basicSurfaceOfRevolution get uv]}"
  Var "param [basicSurfaceOfRevolution get param]"
  Var function
  Method <Function> {param script} {
    if {[llength $param] != 1} {Error "Function must be of one variable"}
    set [var param] $param
    set [var function] $script
  }
  ClassVar "Function-template {{t} {\n  let (x,z) = (sqrt(1+t^2),t)\n}}"

  Var rotate-axes "rotate-point {[basicSurfaceOfRevolution get rotate-point]}"
  Method <Rotate> {axes {point {0 0}}} {
    if {[llength $axes] != 2} \
      {Error "Rotations must occur in a plane formed by two axes"}
    set [var rotate-axes] $axes
    set [var rotate-point] $point
  }
  ClassVar \
    "Rotate-template {{x y} {[basicSurfaceOfRevolution get rotate-point]}}"

  ClassVar {script-templates {Domain Function Rotate}}

  Method ScriptBegin {} {
    Vars domain uv function param rotate-axes rotate-point
    Parent ScriptBegin
    set domain [Parent get domain]
    set uv [Parent get uv]
    set function {}
    set param [Parent get param]
    set rotate-axes {}
    set rotate-point [Parent get rotate-point]
  }

  Method ScriptEnd {} {
    Vars rotate-axes
    Parent ScriptEnd
    Self SetUV
    if {${rotate-axes} == ""} \
      {set rotate-axes [lrange [Self Inherit axes] 0 1]}
  }
}

SurfaceOfRevolution Register
