Export Lighting Cues

146 views
Skip to first unread message

Alexander R. Taylor

unread,
Nov 15, 2025, 12:39:33 PM (8 days ago) Nov 15
to QLab
Hello,

Is there a way to export the fixture values of each lighting cue? I'm trying to import the cues into an Eos system as CSV without rewriting the whole show.

Thanks,
Alexander

Sent from my iPhone!

Paul

unread,
Nov 17, 2025, 5:41:41 PM (6 days ago) Nov 17
to QLab
Yes, you can export the lighting commands fairly easily. But it is more difficult to get that data into a format EOS can import. You will need to figure out the various parameters (apart from intensity) you are using (colours, focus or whatever) and their equlivant EOS numbers. You also need to export the cues and the levels in separate files as you need to import these separately into EOS.
So the question becomes is it quicker to re-plot from scratch in EOS; just depends on the scale of the show file. 

The script below will export Lighting cue command from Qlab into 2 CSV files which can be imported into EOS. It only handles red, green,blue and intensity parameters (you can add others) and doesn't attempt to deal with cues which reference another cue ("pallets") so if you've used those it will almost certainly break. It will ignore any lighting cues which have a non-numeric cue number as EOS only handles numeric cue numbers (so you might want to adjust your workspace before using).

Also EOS csv import is not very robust and if you get the data wrong it crashes. I have done minimal testing on this (just a few cues) and it works but please back up your Workspace and make sure you understand what the script does before running it.

-- Export lighting cues and levels to CSV for import into EOS


tell application id "com.figure53.QLab.5" to tell front workspace

set nl to linefeed

-- define the mapping to EOS parameter numbers

-- if you are using more parameters other than RGB you will need to find the number from EOS and add them here

-- note some parameter numbers can be 1000s (X-Focus) and this scheme may be impractical in those cases.

set paramNames to my blankArray(14)

-- here we just assume only RGB fixtrues are in use

set item 1 of paramNames to "Intens"

set item 12 of paramNames to "red"

set item 13 of paramNames to "green"

set item 14 of paramNames to "blue"

---- initalise the first two rows for cues csv data

set ecuerows to {"START_TARGETS"}

set end of ecuerows to "TARGET_TYPE,TARGET_TYPE_AS_TEXT,TARGET_LIST_NUMBER,TARGET_ID,TARGET_DCID,PART_NUMBER,LABEL,TIME_DATA,UP_DELAY,DOWN_TIME,DOWN_DELAY,FOCUS_TIME,FOCUS_DELAY,COLOR_TIME,COLOR_DELAY,BEAM_TIME,BEAM_DELAY,DURATION,ALERT_TIME,MARK,BLOCK,ASSERT,ALL_FADE,PREHEAT,FOLLOW,LINK,LOOP,CURVE,RATE,EXTERNAL_LINKS,EFFECTS,MODE,CUE_NOTES,SCENE_TEXT,SCENE_END,WIDTH,HEIGHT"

-- add the cue list target (at top and bottom)

set elistrow to my blankArray(37)

set item 1 of elistrow to 15 -- cue list target

set item 2 of elistrow to "Cue_List"

set item 4 of elistrow to 1 -- cue list 1

set AppleScript's text item delimiters to ","

set end of ecuerows to (elistrow as text)

-- define a default eos cue row

set decr to my blankArray(37)

set item 1 of decr to 1 -- cue target

set item 2 of decr to "Cue"

set item 3 of decr to 1 -- cue list 1

----- initalise the headers for levels CSV data

set elrows to {"START_LEVELS"}

set end of elrows to "TARGET_TYPE,TARGET_TYPE_AS_TEXT,TARGET_LIST_NUMBER,TARGET_ID,TARGET_PART_NUMBER,CHANNEL,PARAMETER_TYPE,PARAMETER_TYPE_AS_TEXT,LEVEL,LEVEL_REFERENCE_TYPE,LEVEL_REFERENCE_TYPE_AS_TEXT,LEVEL_REFERENCE_LIST_NUMBER,LEVEL_REFERENCE_ID,FADE_TIME,DELAY_TIME,MARK_CUE,TRACK_TYPE,EFFECT"

-- define a default row for the levels data

set dr to my blankArray(17)

-- set common standard columns of EOS CSV output

set item 1 of dr to 1 -- target type

set item 2 of dr to "Cue"

set item 3 of dr to 1 -- cue list 1

-- loop through the lighting cues in this workspace

repeat with lxcue in (cues whose q type is "light")

-- get the cue number and check it is numeric (non-numeric cue numbers are ignored)

try

set cueNum to q number of lxcue as number

on error errMesg

display notification errMesg with title "Non-numeric cue num " & cueNum

end try

-- catch the case where cue numbers are not numbers, otherwise this will break

-- TODO you many want to remove 'LX' prefix  if used here

if (class of cueNum is integer) or (class of cueNum is real) then

-- put the cue data (cue num, cue name, duration) into its row 

set ecrow to decr

set item 4 of ecrow to cueNum

set item 7 of ecrow to (q display name of lxcue as string)

-- this is the Up Time duration ...

set item 8 of ecrow to (duration of lxcue)

-- ... EOS supports lots of timings, so the duration is in the CSV file again

set item 18 of ecrow to (duration of lxcue)

set AppleScript's text item delimiters to ","

set end of ecuerows to (ecrow as text)

set elrow to dr

-- get the lighting command text of the lighting cue (of the form ch = level eg 8 = 45 each channel parameter on its own line)

set lxlines to paragraphs of (command text of lxcue as string)

repeat with cl in lxlines

set w to words of cl

try

set ch to item 1 of w

-- Qlab lighting commands sometimes include a parameter (eg red) but if just intensity, it is omitted.

-- NOTE: if you have used references to other cues, this is not deall with here and will break! or give unpredicatable results

if (item 2 of w) is "=" then

-- intensity

set lev to item 3 of w

set pnum to 1

set pdesc to "Intens"

else

-- non-intensity parameter

set pdesc to item 2 of w

set lev to item 4 of w

end if

-- grab the Eos parameter number (for rgb, pan, tilt etc) from the paramNames list using custom function

set pnum to my indexOf(paramNames, pdesc)

-- update the essential columns in the eos row

-- col 4 is cue num, col 6 is channel, col7 is eos parameter num, col 8 is param desc, col 9 is the level

-- 6 is ch, 7 is param num, 8 param desc, 9 is level

set item 4 of elrow to cueNum

set item 6 of elrow to ch

set item 7 of elrow to pnum

set item 8 of elrow to pdesc

set item 9 of elrow to lev

set AppleScript's text item delimiters to ","

-- append this data to the cumlative eos row data

set end of elrows to (elrow as text) as string

end try

end repeat

else

display notification "skiping cue as non numeric cue number"

end if

end repeat

set AppleScript's text item delimiters to ","

set end of ecuerows to (elistrow as text)

--set AppleScript's text item delimiters to linefeed

set end of ecuerows to "END_TARGETS"

set end of elrows to "END_LEVELS"

-- get the Worksapce name to use in file name

set AppleScript's text item delimiters to "."

set workspaceName to first text item of ((q number) as string)

set basename to workspaceName & "_export4Eos"

set AppleScript's text item delimiters to linefeed

display dialog "Export Lighting to EOS as CSV" & linefeed & basename & linefeed & (ecuerows as text) with title "Export to file"

end tell


-- now export the lines to files for cues and levels


set cues_filepath to POSIX path of (path to desktop) & basename & "_cues.csv"

set levels_filepath to POSIX path of (path to desktop) & basename & "_levels.csv"

try

set myfile to open for access cues_filepath with write permission

write (ecuerows as text) & linefeed to myfile

--write (elrows as text) & linefeed to myfile starting at eof

on error e

display dialog e

end try

try

set myfile to open for access levels_filepath with write permission

write (elrows as text) & linefeed to myfile starting at eof

display dialog "Lighting data exported as CSV for EOS to " & nl & cues_filepath & nl & levels_filepath with title "Export finished"

on error e

display dialog e

end try


on indexOf(myList, myitem)

repeat with n from 1 to length of myList

if item n of myList is myitem then

return n

end if

end repeat

return 0

end indexOf


on blankArray(numEl)

-- generate an array with num of elements

set A to {}

repeat with n from 1 to numEl

set end of A to ""

end repeat

return A

end blankArray


Alexander (Mailing List) Taylor

unread,
Nov 18, 2025, 7:58:41 AM (5 days ago) Nov 18
to ql...@googlegroups.com
Thank you very much for sharing this.  I'm looking forward to tweaking this and transferring the 78 cues we have now.

Thanks again,
Alexander


On Nov 17, 2025, at 5:41 PM, Paul <paulthom...@gmail.com> wrote:

Caution - This email is from outside ORCSD. Do not click links or open attachments unless you recognize the sender and know the content is safe.
--
Contact support anytime: sup...@figure53.com
User Group Code of Conduct: https://qlab.app/code-of-conduct/
 
Instagram: https://www.instagram.com/Figure53
TikTok: https://www.tiktok.com/@QLab.app
Bluesky: https://bsky.app/profile/qlab.app
---
You received this message because you are subscribed to the Google Groups "QLab" group.
To unsubscribe from this group and stop receiving emails from it, send an email to qlab+uns...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/qlab/0bc98121-28b0-4c27-88c9-ba417506eb64n%40googlegroups.com.

The Right-To-Know Law provides that most e-mail communications to or from School District employees regarding the business of the School District are government records available to the public upon request. Therefore, this e-mail communication may be subject to public disclosure.

Paul

unread,
Nov 20, 2025, 7:35:36 AM (3 days ago) Nov 20
to QLab
A few important points: EOS only deals with channel numbers; if you have give your lighting fixtures in Qlab meaningful names (in general a "good thing"), this won't work. You can change the fixture names for channel numbers in the Lighting Patch fairly easily but it's more prep. And obviously the fixture types in the lighting patch must be the same for Qlab and EOS.

There are a few parameters for some fixtures which contain spaces (like "deep red" on lustr 3) and my script breaks in these cases. If you are only using simple parameters / fixtures (like dimmers with intensity or RGBW LED fixtures) you should be fine.
Also EOS works differently, in that it always has an Intensity parameter (which is sometimes virtual) which needs to be set; that is in Qlab you can have 1.red=100 and the light will come on in red. In EOS you have red=100 and you need intensity = 100 . My script does not do this (in this version) so you may find even if it imports ok, non of the lights are actually on as they have no intensity!  It may be slightly tricky to implement this, as some fixtures have intensity as an actual DMX parameter and you can't (it seems) mark a color in one cue in Qlab.

Finally because of the way it has to work out the parameter numbers, using several loops, the script runs fairly slowly.  Hopefully this would not be an issue as you only run it once.  As I mentioned in my original post if you have a few channels and cues (<100) it might be quicker to re-plot from scratch in EOS.

Alexander (Mailing List) Taylor

unread,
Nov 20, 2025, 7:45:31 AM (3 days ago) Nov 20
to ql...@googlegroups.com
I used your cue as a starting off point.  I ended up rewriting it to export all the cues -> channels -> parameters in JSON, so I could do batch changes easily.  It's 79 cues, so not a ton, but not nothing either.  What's throwing me at the moment is the differentiation (or lack thereof) between groups and fixtures in QLab.  I guess the simple thing would be to rename the fixtures to EOS channel numbers and the groups as well.  QLab doesn't update the cues to reflect fixture name changes automatically though.

I wish there was a way to capture the DMX output values each lighting cue generates, then I could write a script that re-parses that into whatever cues and fixture definitions exist in the EOS output csv.

Thanks,
Alexander


micpool

unread,
Nov 20, 2025, 8:00:47 AM (3 days ago) Nov 20
to QLab
You can read the values directly from an open DMX status window with this.

tell application "System Events" to tell (first application process whose bundle identifier is "com.figure53.QLab.5")

tell window "DMX Status"

set allValues to value of UI elements

end tell

end tell


set currentTIDs to AppleScript's text item delimiters

set AppleScript's text item delimiters to space

set DMXlevels to items 1 thru 512 of allValues as text

set AppleScript's text item delimiters to currentTIDs




Mic

Alexander R. Taylor

unread,
Nov 20, 2025, 7:43:12 PM (3 days ago) Nov 20
to ql...@googlegroups.com, ql...@googlegroups.com
So, I ran into another issue.  The cue I'm working on now has 76 parameter values (not home).  The DMX status window only has 8 channels with values.  Any clue what's up?

image0.jpegThanks,
Alexander

Sent from my iPhone!

On Nov 20, 2025, at 7:45 AM, Alexander (Mailing List) Taylor <ataylo...@orcsd.org> wrote:

 I used your cue as a starting off point.  I ended up rewriting it to export all the cues -> channels -> parameters in JSON, so I could do batch changes easily.  It's 79 cues, so not a ton, but not nothing either.  What's throwing me at the moment is the differentiation (or lack thereof) between groups and fixtures in QLab.  I guess the simple thing would be to rename the fixtures to EOS channel numbers and the groups as well.  QLab doesn't update the cues to reflect fixture name changes automatically though.

micpool

unread,
Nov 21, 2025, 10:51:15 AM (2 days ago) Nov 21
to QLab
Are you looking at the wrong Universe?

Alexander R. Taylor

unread,
Nov 21, 2025, 11:08:21 AM (2 days ago) Nov 21
to ql...@googlegroups.com, QLab
That was my first thought, there's only one in use though.  I tried cycling through the first few and all but 0/0/0 were 0 values.

Alexander

Sent from my iPhone!

On Nov 21, 2025, at 10:51 AM, micpool <m...@micpool.com> wrote:

Are you looking at the wrong Universe?

micpool

unread,
Nov 21, 2025, 11:42:39 AM (2 days ago) Nov 21
to QLab
On Friday, November 21, 2025 at 4:08:21 PM UTC Alexander R. Taylor wrote:
That was my first thought, there's only one in use though.  I tried cycling through the first few and all but 0/0/0 were 0 values.

Alexander

Sent from my iPhone!

On Nov 21, 2025, at 10:51 AM, micpool <m...@micpool.com> wrote:

Are you looking at the wrong Universe?

That's odd

If you open the lighting dashboard do all the DMX values change as expected from the Faders?

Have you checked the lighting patch?

Have you tracked through the show to that cue to see if this is just a result of firing a cue out of sequence?

 

Paul

unread,
Nov 22, 2025, 8:46:55 AM (yesterday) Nov 22
to QLab
  • What's throwing me at the moment is the differentiation (or lack thereof) between groups and fixtures in QLab.  I guess the simple thing would be to rename the fixtures to EOS channel numbers and the groups as well.
Ahhhh, yes if you have programmed lights using groups in Qlab you won't be able to export them to EOS. (at least not without a lot of intermediate processing). This is a fundamental difference between EOS and Qlab - in EOS groups are only a means of selection; everything else related to parameters is done via channels.
Slightly better news, is that Qlab will update the names in the command text of light cues if you change them in the lighting patch. 
Trying to grab the DMX or ArtNet data directly is possible (although likely to be error prone) and it gives you nothing about timings and cue names, which is you are wanting to edit the show later, is essential information.

sadly, given the amount of time (collectively) has been spent on this, I reckon in time wise, I could have reprogrammed the show from scratch in EOS by now. Although obviously, the intellectual challenge remains! but theatre being a practical business sometimes you just need to get the show up on time!

Alexander R. Taylor

unread,
10:54 AM (7 hours ago) 10:54 AM
to ql...@googlegroups.com, QLab
So, it's far more simple and embarrassing.  I hadn't realized the rental license on this machine had expired.  So there is no issue there!

It would be nice if there was a warning on the DMX output window that said "License limited to 16 outputs" or something.

Thanks,
Alexander

Sent from my iPhone!

On Nov 21, 2025, at 11:08 AM, Alexander R. Taylor <alexand...@orol.org> wrote:

That was my first thought, there's only one in use though.  I tried cycling through the first few and all but 0/0/0 were 0 values.

micpool

unread,
11:28 AM (7 hours ago) 11:28 AM
to QLab
On Sunday, November 23, 2025 at 3:54:51 PM UTC Alexander R. Taylor wrote:
So, it's far more simple and embarrassing.  I hadn't realized the rental license on this machine had expired.
 
It would be nice if there was a warning on the DMX output window that said "License limited to 16 outputs" or something.

The licensing errors would be flagged in the lighting patch and in the warnings list, but, a warning on a lighting cue in a cue list that involved any lighting channels that were void because of licensing issues, might be more consistent with how other cue types which have licensing issues make clear to the user that they are not going to work as intended.

Mic

Alexander R. Taylor

unread,
1:09 PM (5 hours ago) 1:09 PM
to ql...@googlegroups.com, QLab
Agreed.  That's how I found it, after several hours of banging my head against the workspace.

Thanks again,
Alexander

Sent from my iPhone!

On Nov 23, 2025, at 11:28 AM, micpool <m...@micpool.com> wrote:

--
Contact support anytime: sup...@figure53.com
User Group Code of Conduct: https://qlab.app/code-of-conduct/
 
Instagram: https://www.instagram.com/Figure53
TikTok: https://www.tiktok.com/@QLab.app
Bluesky: https://bsky.app/profile/qlab.app
---
You received this message because you are subscribed to the Google Groups "QLab" group.
To unsubscribe from this group and stop receiving emails from it, send an email to qlab+uns...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages