Thanks Chris!

I still seem to be getting some inconsistencies related to your script. I thought I'd align each button by its bottom, but that did not seem to help. It seems it reads a partial correct order. I've placed a copy of the stack here:

http://dl.dropbox.com/u/6767916/RefrigMagnetTest.livecode

It seems like some of the custom properties are not registering correctly...?

Thanks for your help!

John Patten
SUSD



On Jan 31, 2011, at 11:11 AM, form wrote:

Slight fix to the code:

if x < x1 and abs(x1 - x) >= abs(y1 - y) and d < nxtd and the lastbtn of btn
b < 1 then

Needed to make sure the button wasn't already used in the previous line.

~ Chris Innanen
~ Nonsanity



On Mon, Jan 31, 2011 at 2:00 PM, form <f...@nonsanity.com> wrote:

I'm thinking you're going for refrigerator poetry magnets, or something like it. To that end, I made something that reads the order similar to the way a human would. I haven't tested it a lot, but this was the arrangement I
used:

http://dl.dropbox.com/u/144280/btnorder.png

There are a dozen buttons, named with their btn number. (So button 6 is named "6".) Notice that word 8 is at about the same level as word 9, but
still counts as part of the second row.

Running the following script sets properties on all the buttons (and one on the card) that lets you easily walk through them from other scripts. The scanrwords command needs to be re-run after moving the buttons, but only
then.

The last chunk of the scanwords command does a sample walkthrough and
outputs the buttons in "word" order to the messagebox. Use that code in
other functions that need to move through the words.


on scanwords
  -- clear the custom properties
  repeat with a = 1 to the number of btns
     set the nextbtn of btn a to "0"
     set the lastbtn of btn a to "0"
     set the startsline of btn a to "0"
     set the linenumber of btn a to "0"
     set the nextline of btn a to "0"
  end repeat

  repeat with a = 1 to the number of btns
     put item 1 of the loc of btn a into x
     put item 2 of the loc of btn a into y
     put "" into nxtbtn
     put 100000000 into nxtd
     repeat with b = 1 to the number of btns
        if a = b then next repeat
        put dist( loc of btn a, loc of btn b ) into d
        put item 1 of the loc of btn b into x1
        put item 2 of the loc of btn b into y1
        if x < x1 and abs(x1 - x) >= abs(y1 - y) and d < nxtd then
           put d into nxtd
           put b into nxtbtn
        end if
     end repeat
     if nxtbtn is not empty then
        set the nextbtn of btn a to nxtbtn
        set the lastbtn of btn nxtbtn to a
     end if
  end repeat

  put "" into sortlines
  repeat with a = 1 to the number of btns
     if the lastbtn of btn a < 1
then put item 2 of the loc of btn a &","& a & return after sortlines
  end repeat
  sort lines of sortlines numeric by item 1 of each
  repeat with a = 1 to the number of lines in sortlines
     set the startsline of btn (item 2 of line a of sortlines) to a
  end repeat

  set the firstbtn of this card to item 2 of line 1 of sortlines
  put 0 into lasttgt
  repeat with a = 1 to the number of lines in sortlines
     put item 2 of line a of sortlines into tgt
     set the linenumber of btn tgt to a
     if lasttgt > 0 then set the nextline of btn lasttgt to tgt
     put the short name of btn tgt &"," after output
     put tgt into lasttgt
     put the nextbtn of btn tgt into tgt
     repeat while tgt > 0
        set the linenumber of btn tgt to a
        put the short name of btn tgt &"," after output
        put tgt into lasttgt
        put the nextbtn of btn tgt into tgt
     end repeat
  end repeat

-- all buttons are now tagged with the information needed to read them
  -- the first button is in the firstbtn of this card
-- buttons that start a new line have a startsline property of the line
they start
  -- the line each button is on is in its linenumber property
-- the nextbtn and lastbtn point to the next and last button in that
line, respectively
  -- buttons at the end of a line have a nextline property with
  --    the number of the next line's first button

  -- output the "words" in order to the msg box
  put "" into output
  put the firstbtn of this card into tgt
  repeat while tgt > 0
     put tgt &"," after output
     get the nextbtn of btn tgt
     if it < 1 then get the nextline of btn tgt
     put it into tgt
  end repeat
  delete last char of output
  put output into msg
end scanwords


function dist a, b
return sqrt( (item 1 of b - item 1 of a)*(item 1 of b - item 1 of a) +
(item 2 of b - item 2 of a)*(item 2 of b - item 2 of a) )
end dist


~ Chris Innanen
~ Nonsanity


_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode


_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to