Getting Contents of Multiple fields in order (Left-to-Right&Down)
form
form at nonsanity.com
Mon Jan 31 14:11:08 EST 2011
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 <form at 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
>
>
More information about the use-livecode
mailing list