Require Class/basicArrows

basicArrows Subclass basicVectors {

  Method Compute {} {
    uplevel [list Self MakeArrows \
      [uplevel [list Self Vectors2Arrows [val arrows]]]]
    uplevel Self Recolor
  }

  Method Vectors2Arrows {vectors} {
    set arrows {}
    foreach vector $vectors {
      set data $vector; set vector [lindex $vector 0]
      if {[llength $vector] != 2} \
        {Error "Vector '$vector' should be a basepoint and an offset"}
      set P [lindex $vector 0]; set V [lindex $vector 1]
      set len [llength $P]
      if {$len != [llength $V]} \
        {Error "Basepoint '$P' and offset '$V' must have the\
                same number of components"}
      for {set i 0; set P1 {}} {$i < $len} {incr i} \
        {lappend P1 [expr [lindex $P $i] + [lindex $V $i]]}
      lappend arrows [lreplace $data 0 0 [list $P $P1]]
    }
    return $arrows
  }

  Method MakeA {arrows data getData} {
    set A {}
    Self MakeAlist [uplevel [list subst $arrows]] $data $getData
    return $A
  }

  Method MakeAlist {arrows data getData} {
    upvar A A
    set makeface [Self method MakeFace]
    set alen [llength $arrows]
    for {set k 0} {$k < $alen} {incr k} {
      if {[lindex $arrows [expr $k + 1]] == "<-"} {
        set list [lindex $arrows $k]
        if {[llength [lindex [lindex $list 0] 0]] == 1} {set list [list $list]}
        uplevel [list Self MakeAlist $list \
           [Self GetData $data [lindex $arrows [expr $k+2]] $getData] $getData]
        incr k 2
      } else {
        set arrow [_expr(List) [lindex $arrows $k] 3]
        if {[llength $arrow] != 2} \
          {Error "Vector '$arrow' should be a basepoint and an offset"}
        lappend A [eval [list $makeface $arrow] $data]
      }
    }
  }

  Method V2Arrows {arrows {data {s "" n {}}}} {
    return [Self MakeA $arrows $data [Self method VFdata]]
  }
}
