Getting Contents of Multiple fields in order (Left-to-Right&Down)

form form at nonsanity.com
Mon Jan 31 13:00:33 CST 2011


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


More information about the use-livecode mailing list