[JW Lua] Measure width in score changes when measure width in a part is changed after Undo/Redo - Workaround

Jan Angermüller jan at angermueller.com
Thu Apr 4 08:40:22 CEST 2024


I can now confirm that the workaround seems to solve the measure width 
undo/redo problem in Perfect Layout. I have also added the code to 
another plug-in and it fixed the problem too.

Probably it makes sense to add this code to all plug-ins that change the 
measure width in parts.
Maybe it makes sense to even support this directly through RGP Lua?

Below is the full code that I used.

Robert, I was wondering about one thing:
according to my notes changing the FCMeasure object works best when the 
part has the focus with part:ViewInDocument().
In a first attempt I had also added p:ViewInDocument() to my code below 
when the plug-in was applied to the part only and the measure width had 
to be corrected in the invisible score (see commented line below).
However, the workaround also worked fine when I removed ViewInDocument.
Is FCMeasure safe without ViewInDocument?
Or is it because of the Finale bug that this weird workaround even works 
without ViewInDocument?

Jan


-- add to the beginning of the code
local parts=finale.FCParts()
parts:LoadAll()
local NumParts=parts.Count
local part=finale.FCPart(finale.PARTID_CURRENT)
local CurrentPartIsScore=part:IsScore()

function FixMeasureWidthInScore(region)
     if NumParts>1 then
         local p
         if not CurrentPartIsScore then
             p=finale.FCPart(0)
             p:SwitchTo()
             --p:ViewInDocument()  --seems to be not necessary
         end
         if region==nil then
             region=finale.FCMusicRegion()
             region:SetFullDocument()
         end
         local i
         for i=region.StartMeasure, region.EndMeasure do
             local meas=finale.FCMeasure()
             meas:Load(i)
             meas.Width=meas.Width+1
             meas:Save()
             meas.Width=meas.Width-1
             meas:Save()
         end
         if not CurrentPartIsScore then
             p:SwitchBack()
             --add code for ViewInDocument of original part  -> but 
seems to be not necessary
         end
     end
end

...

FixMeasureWidthInScore(region)  --add this line at the very end of the 
script






Am 03.04.2024 um 16:34 schrieb Robert Patterson:
> I saw an additional issue, which is that the Undo does not undo the 
> part width setting. I found some notes about this in my Patterson 
> Plugins code, so the problem has been around a while.
>
> Glad you found a workaround.
>
> On Wed, Apr 3, 2024 at 9:29 AM Jan Angermüller <jan at angermueller.com> 
> wrote:
>
>     Thank you for the quick response, Robert!
>     I found a workaround which at least works in the test case below:
>     When I (re-)save the measure width in the score afterwards, it is
>     still the same bug.
>     BUT:
>     When I slightly change the measure width in the score, save it,
>     then restore the original value and save it again, both the
>     measure width in the score and in the parts seem to have the
>     correct value.
>     It seems to set a flag in Finale that the measure width in the
>     score has indeed changed.
>
>     I will have to check if this also solves the problem in Perfect
>     Layout.
>
>     Here is the new test code with the additional lines in bold:
>
>     --Show measure 1 width from score
>     local meas=finale.FCMeasure(1)
>     meas:Load(1)
>     print("Measure Width in Score",meas.Width)
>
>     --Load Part 3 and change
>     local p=finale.FCPart(3)
>     p:SwitchTo();
>         p:ViewInDocument()
>         meas=finale.FCMeasure(1)
>         meas:Load(1)
>         print("Measure Width in Part ",p.ID,meas.Width)
>         meas.Width=360
>         meas:Save()
>         print("Measure Width after change",meas.Width)
>     p:SwitchBack();
>
>     --Go back to score and show measure 1 width
>     p=finale.FCPart(0)
>     p:ViewInDocument()
>     meas=finale.FCMeasure(1)
>     meas:Load(1)
>     *meas.Width=meas.Width+1
>     meas:Save()
>     meas.Width=meas.Width-1
>     meas:Save()*
>     print("Measure Width in Score",meas.Width)
>
>     Jan
>
>
>
>     Am 03.04.2024 um 15:34 schrieb Robert Patterson:
>>     This is a bug in Finale. I doubt it will be fixed. But you could
>>     send it to them if you wish.
>>
>>     On Wed, Apr 3, 2024 at 7:53 AM Jan Angermüller
>>     <jan at angermueller.com> wrote:
>>
>>         Robert,
>>
>>         I have noticed several times that undo-ing and re-doing a JW
>>         Lua plug-in can change the measure width.
>>         Finally, I have created a short reproduceable demo that I
>>         can't explain.
>>
>>         The script is below.
>>         When applied to the score of the attached Finale file, it
>>         switches to linked part 3, loads measure 1 and changes its
>>         measure width to 360 and then returns to the score.
>>         The measure width in the score remains unchanged. So far,
>>         everything ok.
>>         Then I undo the plug-in in Finale and click on Edit->Redo ...
>>         Now the width in measure 1 also changes in the score!
>>
>>         Here is a video that shows the effect (with a slightly
>>         different version of the score):
>>         https://www.youtube.com/watch?v=lPJd3sq9zQg
>>
>>         In Perfect Layout it makes Finale's Undo-/Redo feature
>>         unusuable, because it (nearly) always changes the measure
>>         widths in the score for an unknown  reason.
>>         Do you have an idea how I can prevent this?
>>
>>         Jan
>>
>>         --Show measure 1 width from score
>>         local meas=finale.FCMeasure(1)
>>         meas:Load(1)
>>         print("Measure Width in Score",meas.Width)
>>
>>         --Load Part 3 and change
>>         local p=finale.FCPart(3)
>>         p:SwitchTo();
>>             p:ViewInDocument()
>>             meas=finale.FCMeasure(1)
>>             meas:Load(1)
>>             print("Measure Width in Part ",p.ID,meas.Width)
>>             meas.Width=360
>>             meas:Save()
>>             print("Measure Width after change",meas.Width)
>>         p:SwitchBack();
>>
>>         --Go back to score and show measure 1 width
>>         p=finale.FCPart(0)
>>         p:ViewInDocument()
>>         meas=finale.FCMeasure(1)
>>         meas:Load(1)
>>         print("Measure Width in Score",meas.Width)
>>         _______________________________________________
>>         JWLua mailing list
>>         JWLua at jwmusic.nu
>>         http://jwmusic.nu/mailman/listinfo/jwlua_jwmusic.nu
>>
>>
>>     _______________________________________________
>>     JWLua mailing list
>>     JWLua at jwmusic.nu
>>     http://jwmusic.nu/mailman/listinfo/jwlua_jwmusic.nu
>
>     -- 
>     Jan Angermüller
>     Orchideenstieg 13
>     22297 Hamburg
>     Tel. 040 - 28 94 84 82
>     Mobil 0173 - 99 33 904
>     www.elbsound.studio  <http://www.elbsound.studio>
>
>     _______________________________________________
>     JWLua mailing list
>     JWLua at jwmusic.nu
>     http://jwmusic.nu/mailman/listinfo/jwlua_jwmusic.nu
>
>
> _______________________________________________
> JWLua mailing list
> JWLua at jwmusic.nu
> http://jwmusic.nu/mailman/listinfo/jwlua_jwmusic.nu

-- 
Jan Angermüller
Orchideenstieg 13
22297 Hamburg
Tel. 040 - 28 94 84 82
Mobil 0173 - 99 33 904
www.elbsound.studio
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://jwmusic.nu/pipermail/jwlua_jwmusic.nu/attachments/20240404/ed55261a/attachment.htm>


More information about the JWLua mailing list