alignEvenly

$canvaseditor alignEvenly
aligns selection such that center coordsare equal distant

obj method canvaseditor alignEvenly {} {
  set before [$self undoRedoCode]
  $self dots -selected storeXY
  $self selected calcCenter
  set objL1 [my selection]
  foreach obj $objL1 {
    set centerDot [$obj private centerDot]
    lappend objL2\
      [list $obj [$centerDot cget -x] [$centerDot cget -y]]
  }
  set width [-\
      [max {*}[lmap el $objL2 {lindex $el 1}]]\
      [min {*}[lmap el $objL2 {lindex $el 1}]]]
  set height [-\
      [max {*}[lmap el $objL2 {lindex $el 2}]]\
      [min {*}[lmap el $objL2 {lindex $el 2}]]]
  if {$width > $height} then {
    set objL3 [lsort -real -index 1 $objL2]
  } else {
    set objL3 [lsort -real -index 2 $objL2]
  }
  set segs [- [llength $objL3] 1]
  set dot0 [[lindex $objL3 0 0] private centerDot]
  set dot1 [[lindex $objL3 end 0] private centerDot]
  set x0 [$dot0 cget -x]
  set y0 [$dot0 cget -y]
  set x1 [$dot1 cget -x]
  set y1 [$dot1 cget -y]
  set dx [- $x1 $x0]
  set dy [- $y1 $y0]
  for {set i 1} {$i < $segs} {incr i} {
    set li [lindex $objL3 $i]
    lassign $li obj cx cy
    set zx [expr {$x0 + $dx / $segs * $i}]
    set zy [expr {$y0 + $dy / $segs * $i}]
    set xDist [- $zx $cx]
    set yDist [- $zy $cy]
    $obj dots transform moveHorizontal $xDist moveVertical $yDist
    $self select $obj
    $obj draw
    $self select $obj
  }
  set after [$self undoRedoCode]
  $self initUndoRedo $before $after
}

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