[JW Lua] Insert Staff Or Reorder Staves

Martin Marris mmarris at notecraft.com
Thu Dec 17 14:42:07 CET 2020


OK, after a lot of head-scratching I figured it out. The script below appends a new staff to the bottom of a score, then moves the new staff to the top of the score. It is just a proof of concept and only processes the staff order in Scroll View. I am now working on Page View which should be similar except that (as I understand it) all the System Staves haves to be processed, using a loop. The index starts at 1 (0 is Scroll View).

 

At one point I needed to store the absolute value of an element in a Lua table, and then break the pointer to the table because the table was going to change later and I needed the original value preserved. The only way I could find was to load that table value into a variable, and then … destroy the table. Silly, because I needed that table, so I had to create it again immediately after extracting the “unchangeable value” of the element.

 

There must be a much better way, although of course this is a Lua language question and has nothing to do with JW Lua per se. I have read the chapter about tables in manual (“Programming in Lua”) but did not obtain enlightenment.

 

Anyway, this code works, and that’s what matters.

 

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

 

--append a new staff to the bottom of the score

local staffID = finale.FCStaves.Append()

local staff = finale.FCStaff()

staff:Load(staffID)

staff.InstrumentUUID = finale.FFUUID_BLANKSTAFF

local strName =finale.FCString()

strName.LuaString="NEW STAFF"

staff:SaveNewFullNameString (strName)

local strAbrev =finale.FCString()

strAbrev.LuaString="N. STF."

staff:SaveNewAbbreviatedNameString (strAbrev)

staff:Save()

 

--store the value of the top staff prior to re-ordering the staves

local sysstaff_table = {}

local sysstaves= finale.FCSystemStaves()

sysstaves:LoadScrollView()

for sysstaff in each(sysstaves) do

    table.insert(sysstaff_table, sysstaff)

end

bottom_staff = sysstaff_table[#sysstaff_table]

sysstaff_table = nil    -- the only way I can find to break the pointer to the table is to destroy the table!

 

--which means the same table must now be laboriously re-created anew....

local sysstaff_table = {}

local sysstaves= finale.FCSystemStaves()

sysstaves:LoadScrollView()

for sysstaff in each(sysstaves) do

    table.insert(sysstaff_table, sysstaff)

end

 

--move each staff down by one staff

for i = #sysstaff_table, 1, -1 do

    sysstaff = sysstaff_table[i]

    next_sysstaff = sysstaff_table[i-1]

    if next_sysstaff then

        sysstaff.Staff = next_sysstaff.Staff        --process all staves except the top one.

    else

        sysstaff.Staff = bottom_staff.Staff         --replace value of top staff with value of the appended staff

    end

end

 

sysstaves:SaveAll()

 

=======

Martin

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://jwmusic.nu/pipermail/jwlua_jwmusic.nu/attachments/20201217/3373aad7/attachment.htm>


More information about the JWLua mailing list