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

John Patten johnpatten at mac.com
Mon Jan 31 17:12:18 EST 2011


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 <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
>>
>>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your  
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode





More information about the use-livecode mailing list