Practically Perfect Printing - Progress

Lynch, Jonathan BNZ2 at CDC.GOV
Mon Jan 10 15:41:31 CST 2005


I have a script worked out that seems to print nearly perfectly.

Occassionally, the second line of a field will get shifted upwards by 2
pixels, and I am not sure why that happens.

I am sure much tweaking will need to be done to enable this script to
apply to all situations. I am posting it here - but I imagine it will
get a little garbled by the automatic word-wrap. If anyone would like me
to Email it to them directly, just Email me, and I will do so.

It would be great if a few others could test this script on their
stacks, find bugs, and in general help make it perfect.

The basic principle is that it replaces characters in a field for small
fields in a group, with a single character in each field. This way, if a
character expands during printing, it does not shift around the other
characters on that line.


======================================================================

on mouseUp
  
  -- 1) create new stack with same properties as the original stack
  put the properties of this stack into myArray
  delete variable myArray[Name]
  Delete variable myArray[ID]
  Delete variable myArray[visible]
  put "pr" & the milliseconds into P
  create invisible stack P
  set the properties of stack P to myArray
  
  -- 2) copy the cards of the original stack to the new stack
  put the number of cards in this stack into Z
  repeat with X = 1 to Z
    copy card X of this stack to stack P
  end repeat
  
  -- 3) For every card in the new stack, replace fields with groups with
a separate field for each character
  put the number of cards in stack p into Z
  repeat with X = 1 to Z
    go card X of stack P
    
    -- 3.1) create an array with the id of each field on the card
    put the number of fields in Card X of stack P into ZZ
    repeat with XX = 1 to ZZ
      put the id of field XX into FID[XX]
    end repeat
    
    -- 3.2) group/field replacement process
    repeat with XX = 1 to ZZ
      -- 3.2.1) if field is owned by a group, create the new group
inside the group that owns the field
      if word 1 of (the long id of the owner of field ID FID[XX]) =
"group" then
        put "PG" & (the milliseconds) & XX into GF
        create group GF in group id (the id of the owner of field ID
FID[XX])
        set the relayergroupedcontrols to true
        set the layer of group GF to (the layer of field ID FID[XX]) + 1
        set the relayergroupedcontrols to false
        -- 3.2.1a) otherwise, just create the new group on the same page
as the field
      else
        put "PG" & (the milliseconds) & XX into GF
        create group GF
        set the layer of group GF to (the layer of field ID FID[XX]) + 1
      end if
      
      -- 3.2.3) set the rect of the new group to the rect of the
original field (minus borderwidth, if the border is visible)
      put the rect of field ID FID[XX] into FXXR
      if the showborder of field ID FID[XX] = true then
        put the borderwidth of field ID FID[XX] into BW
        add BW to item 1 of FXXR
        add BW to item 2 of FXXR
        subtract BW from item 3 of FXXR
        subtract BW from item 4 of FXXR
        set the rect of group GF to FXXR
      else
        set the rect of group GF to the rect of field ID FID[XX]
      end if
      set the locklocation of group GF to true
      set the margins of group GF to 0 --the margins of field XX 
      
      --3.3.3) for each character in the original field, create a field
that contains that character
      put the number of characters in field ID FID[XX] into ZZZ
      repeat with XXX = 1 to ZZZ
        create field ("C" & GF & XXX) in group GF
        set the showborder of field ("C" & GF & XXX) to false
        -- 3.3.3.1) the borderwidth affects the location of a character,
but not the formattedrect, so this must be compensated for
        set the borderwidth of field ("C" & GF & XXX) to the borderwidth
of field ID FID[XX]
        -- 3.3.3.2) the margins are set wide enough to allow for a
little expansion room when converted to printer font
        set the margins of field ("C" & GF & XXX) to 8
        set the fixedlineheight of field ("C" & GF & XXX) to false
        
        -- 3.3.3.3) the character is put into the new single-character
field
        put character XXX of field ID FID[XX] into field ("C" & GF &
XXX)
        
        -- 3.3.3.4) the defining information for the field is copied
        set the textsize of field ("C" & GF & XXX) to the effective
textsize of field ID FID[XX]
        set the textstyle of field ("C" & GF & XXX) to the effective
textstyle of field ID FID[XX]
        set the textfont of field ("C" & GF & XXX) to the effective
textfont of field ID FID[XX]
        set the textcolor of field ("C" & GF & XXX) to the effective
textcolor of field ID FID[XX] 
        
        -- 3.3.3.5) the defining information for the character is copied
        set the textsize of character 1 of field ("C" & GF & XXX) to the
textsize of character XXX of field ID FID[XX]
        set the textstyle of character 1 of field ("C" & GF & XXX) to
the textstyle of character XXX of field ID FID[XX]
        set the textfont of character 1 of field ("C" & GF & XXX) to the
textfont of character XXX of field ID FID[XX]
        set the textcolor of character 1 of field ("C" & GF & XXX) to
the textcolor of character XXX of field ID FID[XX] 
        set the backgroundcolor of character 1 of field ("C" & GF & XXX)
to the backgroundcolor of character XXX of field ID FID[XX]
        
        -- 3.3.3.6) the new single-character field is made transparent
        set the opaque of field ("C" & GF & XXX) to false
        
        -- 3.3.3.7) the location of the new single-character field is
set such that the formattedrect of the copied character is the same as
for the original character
        put the formattedrect of character 1 of field ("C" & GF & XXX)
into NFR
        put the formattedrect of character XXX of field ID FID[XX] into
FR
        put (item 1 of FR) + (the left of field ("C" & GF & XXX)) -
(item 1 of NFR) into item 1 of NFR
        put (item 2 of FR) + (the top of field ("C" & GF & XXX)) - (item
2 of NFR) into item 2 of NFR
        put (item 1 of NFR) + (the formattedwidth of field ("C" & GF &
XXX)) into item 3 of NFR
        put (item 2 of FR) + (the formattedheight of field ("C" & GF &
XXX)) + 10 into item 4 of NFR
        set the rect of field ("C" & GF & XXX) to NFR
        put the formattedrect of character 1 of field ("C" & GF & XXX)
into NNFR
      end repeat
      
      -- 3.3.4) the original field is emptied, but left in place in
order to use its border and background information
      --put empty into field ID FID[XX]
    end repeat
  end repeat
  
  -- 4) the first card of stack p is one that was not copied over - so
it is deleted
  delete card 1 of stack p
 -- set the visible of stack p to true
  print stack p
  delete stack p 
  
end mouseUp


More information about the use-livecode mailing list