processXML

$canvaseditor processXML src
parses src as XML, generates command lines, then executes them.

obj method canvaseditor processXML src {
  set tree [xml parse $src]
  foreach {att val} [dict get $tree attribute] {
    if {$att ne "id"} then {
      $self setting $att $val
      switch -exact -- $att {
        width - height - background - bg {
          $self canvas configure -$att $val
        }
      }
    }
  }
  if {[dict get $tree name] eq "canvaseditor"} then {
    $self canvas configure -scrollregion\
      "0 0 [$self canvas cget -width] [$self canvas cget -height]"
  }
  set id2obj {}
  # dot
  foreach path [::xml findElementsByName $tree dot] {
    set dotTree [::xml getElement $tree {*}$path]
    set dotID [dict get $dotTree attribute id]
    if {![dict exists $id2obj $dotID]} then {
      set code "obj new dot\
          -x [dict get $dotTree attribute x]\
          -y [dict get $dotTree attribute y]"
      dict set id2obj $dotID [eval $code]
    }
  }
  # line
  foreach path [::xml findElementsByName $tree line] {
    set lineTree [::xml getElement $tree {*}$path]
    set lineID [dict get $lineTree attribute id]
    if {![dict exists $id2obj $lineID]} then {
      set code "obj new line"
      foreach {key val} [dict get $lineTree attribute] {
        if {$key ni {id}} then {
          lappend code -$key $val
        }
      }
      foreach dotTree [dict get $lineTree content] {
        set dotID [dict get $dotTree attribute id]
        lappend code [dict get $id2obj $dotID]
      }
      dict set id2obj $lineID [eval $code]
    }
  }
  # fill
  foreach path [::xml findElementsByName $tree fill] {
    set fillTree [::xml getElement $tree {*}$path]
    set fillID [dict get $fillTree attribute id]
    set code "obj new fill"
    lappend code\
      -fill [dict get $fillTree attribute fill]\
      -constraint [dict get $fillTree attribute constraint]
    foreach lineTree [dict get $fillTree content] {
      set lineID [dict get $lineTree attribute id]
      lappend code [dict get $id2obj $lineID]
    }
    if {![dict exists $id2obj $fillID]} then {
      dict set id2obj $fillID [eval $code]
    }
  }
  # group
  foreach path [lreverse [::xml findElementsByName $tree group]] {
    set groupTree [::xml getElement $tree {*}$path]
    set groupID [dict get $groupTree attribute id]
    set code "obj new group"
    if {[dict exists $groupTree attribute constraint]} then {
      lappend code -constraint [dict get $groupTree attribute constraint]
    }
    foreach elTree [dict get $groupTree content] {
      set elID [dict get $elTree attribute id]
      lappend code [dict get $id2obj $elID]
    }
    if {![dict exists $id2obj $groupID]} then {
      dict set id2obj $groupID [eval $code]
    }
  }
  set lines {}
  # elements
  foreach path [::xml findElementsByName $tree elements] {
    set elementTree [::xml getElement $tree {*}$path]
    foreach objTree [dict get $elementTree content] {
      set id [dict get $objTree attribute id]
      lappend lines "[dict get $id2obj $id] draw"
    }
  }
  set line "$self raiseTags"
  # stack
  foreach path [::xml findElementsByName $tree stack] {
    set elementTree [::xml getElement $tree {*}$path]
    foreach objTree [dict get $elementTree content] {
      set id [dict get $objTree attribute ref]
      set obj [dict get $id2obj $id]
      set tag [$obj info class]$obj
      lappend line $tag
    }
  }
  lappend lines $line
  eval [join $lines \n]
}

© Wolf-Dieter Busch | Home | Sitemap | Urheber | A-Z