<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.visualsorcery.com/LightForgeWiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.visualsorcery.com/LightForgeWiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chris+Monson</id>
		<title>Light Forge Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://www.visualsorcery.com/LightForgeWiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Chris+Monson"/>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Special:Contributions/Chris_Monson"/>
		<updated>2026-10-11T11:01:50Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.20.0</generator>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-06-15T18:45:50Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* getBPM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Methods=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getBPM==&lt;br /&gt;
'''getBPM() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the BPM of the current cuelist&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getBPM())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isPlaying==&lt;br /&gt;
'''isPlaying() As Boolean'''&lt;br /&gt;
&lt;br /&gt;
Checks to see if the timeline is currently playing back.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startPlayback==&lt;br /&gt;
'''startPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Starts timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying() == False):&lt;br /&gt;
	api.startPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==stopPlayback==&lt;br /&gt;
'''stopPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Stops timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==NextCue==&lt;br /&gt;
'''nextCue()'''&lt;br /&gt;
&lt;br /&gt;
Advances timeline to the next cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.nextCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PreviousCue==&lt;br /&gt;
'''previousCue()'''&lt;br /&gt;
&lt;br /&gt;
Moves timeline to the previous cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.previousCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Event Handling=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onDispose==&lt;br /&gt;
Called when the script is being disposed by either it being disabled, or by Lightforge closing.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onDispose():&lt;br /&gt;
	print(&amp;quot;Addon Disposing&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChange==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChange():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-06-15T18:45:32Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Methods=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getBPM==&lt;br /&gt;
'''getBPM() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getBPM())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isPlaying==&lt;br /&gt;
'''isPlaying() As Boolean'''&lt;br /&gt;
&lt;br /&gt;
Checks to see if the timeline is currently playing back.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startPlayback==&lt;br /&gt;
'''startPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Starts timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying() == False):&lt;br /&gt;
	api.startPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==stopPlayback==&lt;br /&gt;
'''stopPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Stops timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==NextCue==&lt;br /&gt;
'''nextCue()'''&lt;br /&gt;
&lt;br /&gt;
Advances timeline to the next cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.nextCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PreviousCue==&lt;br /&gt;
'''previousCue()'''&lt;br /&gt;
&lt;br /&gt;
Moves timeline to the previous cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.previousCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Event Handling=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onDispose==&lt;br /&gt;
Called when the script is being disposed by either it being disabled, or by Lightforge closing.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onDispose():&lt;br /&gt;
	print(&amp;quot;Addon Disposing&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChange==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChange():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Interface</id>
		<title>Interface</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Interface"/>
				<updated>2013-05-11T21:05:39Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Panels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Lightforge interface is designed to be very customizable and allow you the ability to set up the interface in whatever manner makes the most sense to you, or however makes the most sense for your particular application.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Panels ==&lt;br /&gt;
&lt;br /&gt;
Panels are the main type of interface element that you will work with in Lightforge. Panels can be scaled, split into multiple panels, changed to different panels, or removed entirely. &lt;br /&gt;
&lt;br /&gt;
=== Working With Panels ===&lt;br /&gt;
&lt;br /&gt;
Every panel contains two handles. One to divide or remove a panel in the top right corner, and one to change the panel type in the top left corner.&lt;br /&gt;
&lt;br /&gt;
==== Dividing a Panel ====&lt;br /&gt;
&lt;br /&gt;
To divide a panel into two new panels, click and drag the top right handle either left, to divide the panel horizontally, or down to divide it vertically. An overlay will indicate which direction the panel will divide. If you wish to cancel this operation, just move your mouse back to the original handle position.&lt;br /&gt;
&lt;br /&gt;
==== Removing a Panel ====&lt;br /&gt;
&lt;br /&gt;
To remove a panel, click on the top right handle, and drag it outside the bounds of the panel. The panel will highlight in red indicating that it is going to be removed from the interface. To cancel this operation, move your mouse back to the original handle position.&lt;br /&gt;
&lt;br /&gt;
==== Changing the Panel Type ====&lt;br /&gt;
&lt;br /&gt;
To change the panel type, click on the top left handle, and select the type of panel you would like to use from the drop down menu.&lt;br /&gt;
&lt;br /&gt;
==== Resizing Panels ====&lt;br /&gt;
&lt;br /&gt;
To resize a panel, click and drag anywhere on the panel's border and drag the direction you'd like to scale it in.&lt;br /&gt;
&lt;br /&gt;
=== Panel Types ===&lt;br /&gt;
&lt;br /&gt;
==== Groups ====&lt;br /&gt;
The [[Groups Panel]] is the primary means for managing and selecting your lighting rig.&lt;br /&gt;
&lt;br /&gt;
==== Timeline ====&lt;br /&gt;
The [[Timeline Panel]] is used to manipulate lighting cues and audio files, and position them in time. &lt;br /&gt;
&lt;br /&gt;
==== Show List ====&lt;br /&gt;
The [[Show List Panel]] allows you to move between multiple cue lists in a single show.&lt;br /&gt;
&lt;br /&gt;
==== Cue Editor ====&lt;br /&gt;
The [[Cue Editor Panel]] is used to modify a cue's settings, remove groups or attributes, and keyframe changes over time.&lt;br /&gt;
&lt;br /&gt;
==== Show Controls ====&lt;br /&gt;
The [[Show Controls Panel]] gives you basic transport control (play, pause, next, previous) as well as the ability to add new cues, and audio files, and enable or disable crossfades on certain attribute changes. &lt;br /&gt;
&lt;br /&gt;
==== Submasters ====&lt;br /&gt;
The [[Submasters Panel]] allows you to record intensity information from multiple groups and fixtures at different intensities onto a single fader. &lt;br /&gt;
&lt;br /&gt;
==== Palettes ====&lt;br /&gt;
The [[Palettes Panel]] lets you record presets that can be recalled live or recorded into cues.&lt;br /&gt;
&lt;br /&gt;
==== Effects ====&lt;br /&gt;
The [[Effects Panel]] lets you select, create, and modify effects.&lt;br /&gt;
&lt;br /&gt;
==== Effect Settings ====&lt;br /&gt;
The [[Effect Settings Panel]] allows you to adjust settings on effects, and keyframe effect changes over time. &lt;br /&gt;
&lt;br /&gt;
==== DMX ====&lt;br /&gt;
The [[DMX Panel]] gives you the ability to view the DMX control data that is being output by Lightforge. It also allows you to do simple channel checks. &lt;br /&gt;
&lt;br /&gt;
==== Color Picker ====&lt;br /&gt;
The [[Color Picker Panel]] lets you select a color to be applied to groups or fixtures.&lt;br /&gt;
&lt;br /&gt;
==== Intensity ====&lt;br /&gt;
The [[Intensity Panel]] lets you set or fade to intensity values on groups or fixtures.&lt;br /&gt;
&lt;br /&gt;
==== Positioner ====&lt;br /&gt;
The [[Positioner Panel]] gives you the ability to control the pan and tilt values on groups or fixtures.&lt;br /&gt;
&lt;br /&gt;
==== Attributes ====&lt;br /&gt;
The [[Attributes Panel]] lets you adjust all the various attributes that a lighting fixture may utilize.&lt;br /&gt;
&lt;br /&gt;
==== Audio Player ====&lt;br /&gt;
The [[Audio Player Panel]] lets you play back audio tracks without syncing them to your timeline.&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.output</id>
		<title>Api.output</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.output"/>
				<updated>2013-05-11T20:50:33Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Methods=&lt;br /&gt;
&lt;br /&gt;
==getDMX==&lt;br /&gt;
'''getDMX(universe As Integer) As Byte()'''&lt;br /&gt;
&lt;br /&gt;
Returns a byte array containing all current dmx data for the specified universe. If the specified universe doesn't exist this function returns null.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
dmxValues = api.output.getDMX(0)&lt;br /&gt;
print(dmxValues[42])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getUniverseCount==&lt;br /&gt;
'''getUniverseCount() as Integer'''&lt;br /&gt;
&lt;br /&gt;
Returns the number of DMX universes in the current show.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
universeCount = api.output.getUniverseCount()&lt;br /&gt;
print(universeCount)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-11T20:49:33Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Methods=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isPlaying==&lt;br /&gt;
'''isPlaying() As Boolean'''&lt;br /&gt;
&lt;br /&gt;
Checks to see if the timeline is currently playing back.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startPlayback==&lt;br /&gt;
'''startPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Starts timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying() == False):&lt;br /&gt;
	api.startPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==stopPlayback==&lt;br /&gt;
'''stopPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Stops timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==NextCue==&lt;br /&gt;
'''nextCue()'''&lt;br /&gt;
&lt;br /&gt;
Advances timeline to the next cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.nextCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PreviousCue==&lt;br /&gt;
'''previousCue()'''&lt;br /&gt;
&lt;br /&gt;
Moves timeline to the previous cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.previousCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Event Handling=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onDispose==&lt;br /&gt;
Called when the script is being disposed by either it being disabled, or by Lightforge closing.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onDispose():&lt;br /&gt;
	print(&amp;quot;Addon Disposing&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChange==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChange():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-11T20:49:12Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Methods=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isPlaying==&lt;br /&gt;
'''isPlaying() As Boolean'''&lt;br /&gt;
&lt;br /&gt;
Checks to see if the timeline is currently playing back.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startPlayback==&lt;br /&gt;
'''startPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Starts timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying() == False):&lt;br /&gt;
	api.startPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==stopPlayback==&lt;br /&gt;
'''stopPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Stops timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==NextCue==&lt;br /&gt;
'''nextCue()'''&lt;br /&gt;
&lt;br /&gt;
Advances timeline to the next cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.nextCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PreviousCue==&lt;br /&gt;
'''previousCue()'''&lt;br /&gt;
&lt;br /&gt;
Moves timeline to the previous cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.previousCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onDispose==&lt;br /&gt;
Called when the script is being disposed by either it being disabled, or by Lightforge closing.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onDispose():&lt;br /&gt;
	print(&amp;quot;Addon Disposing&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChange==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChange():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Sidebar</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Sidebar"/>
				<updated>2013-05-11T20:21:10Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** API|API&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-11T06:14:45Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Functions=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isPlaying==&lt;br /&gt;
'''isPlaying() As Boolean'''&lt;br /&gt;
&lt;br /&gt;
Checks to see if the timeline is currently playing back.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startPlayback==&lt;br /&gt;
'''startPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Starts timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying() == False):&lt;br /&gt;
	api.startPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==stopPlayback==&lt;br /&gt;
'''stopPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Stops timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==NextCue==&lt;br /&gt;
'''nextCue()'''&lt;br /&gt;
&lt;br /&gt;
Advances timeline to the next cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.nextCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PreviousCue==&lt;br /&gt;
'''previousCue()'''&lt;br /&gt;
&lt;br /&gt;
Moves timeline to the previous cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.previousCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onDispose==&lt;br /&gt;
Called when the script is being disposed by either it being disabled, or by Lightforge closing.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onDispose():&lt;br /&gt;
	print(&amp;quot;Addon Disposing&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChange==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChange():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-10T01:17:14Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Functions=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isPlaying==&lt;br /&gt;
'''isPlaying() As Boolean'''&lt;br /&gt;
&lt;br /&gt;
Checks to see if the timeline is currently playing back.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==startPlayback==&lt;br /&gt;
'''startPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Starts timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying() == False):&lt;br /&gt;
	api.startPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==stopPlayback==&lt;br /&gt;
'''stopPlayback()'''&lt;br /&gt;
&lt;br /&gt;
Stops timeline playback.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==NextCue==&lt;br /&gt;
'''nextCue()'''&lt;br /&gt;
&lt;br /&gt;
Advances timeline to the next cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.nextCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PreviousCue==&lt;br /&gt;
'''previousCue()'''&lt;br /&gt;
&lt;br /&gt;
Moves timeline to the previous cue.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.previousCue()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChange==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChange():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-10T01:10:35Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Functions=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==isPlaying==&lt;br /&gt;
'''isPlaying() As Boolean'''&lt;br /&gt;
&lt;br /&gt;
Checks to see if the timeline is currently playing back.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
if(api.isPlaying()):&lt;br /&gt;
	api.stopPlayback()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChange==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChange():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-10T00:59:55Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/ www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Congratulations! You've made an addon!&lt;br /&gt;
&lt;br /&gt;
==Where To Go From Here==&lt;br /&gt;
I would suggest investigating the [[API]] and seeing what all there is to do. Also be sure to check out the [[Sample Addons]].&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
&lt;br /&gt;
[[API]]&lt;br /&gt;
&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
&lt;br /&gt;
[[Addon]]&lt;br /&gt;
&lt;br /&gt;
=Sample Addons=&lt;br /&gt;
On this page you can find sample code for learning how to create addons.&lt;br /&gt;
[[Sample Addons]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-10T00:59:45Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Addon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/ www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Congratulations! You've made an addon!&lt;br /&gt;
&lt;br /&gt;
==Where To Go From Here==&lt;br /&gt;
I would suggest investigating the [[API]] and seeing what all there is to do. Also be sure to check out the [[Sample Addons]].&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
&lt;br /&gt;
[[Addon]]&lt;br /&gt;
&lt;br /&gt;
=Sample Addons=&lt;br /&gt;
On this page you can find sample code for learning how to create addons.&lt;br /&gt;
[[Sample Addons]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-09T23:48:09Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* onCuelistChanged */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Functions=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChange==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChange():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T23:41:26Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/ www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Congratulations! You've made an addon!&lt;br /&gt;
&lt;br /&gt;
==Where To Go From Here==&lt;br /&gt;
I would suggest investigating the [[API]] and seeing what all there is to do. Also be sure to check out the [[Sample Addons]].&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;br /&gt;
&lt;br /&gt;
=Sample Addons=&lt;br /&gt;
On this page you can find sample code for learning how to create addons.&lt;br /&gt;
[[Sample Addons]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Main_Page</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Main_Page"/>
				<updated>2013-05-09T23:39:14Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Lightforge Wiki'''&lt;br /&gt;
&lt;br /&gt;
Welcome to the Lightforge Wiki, home of everything there is to know about using Lightforge&lt;br /&gt;
&lt;br /&gt;
[[Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Panels]]&lt;br /&gt;
&lt;br /&gt;
[[Scripting]]&lt;br /&gt;
&lt;br /&gt;
[[Common Tasks]]&lt;br /&gt;
&lt;br /&gt;
[[General Lighting Concepts]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons</id>
		<title>Sample Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons"/>
				<updated>2013-05-09T23:36:37Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Lamps On */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Select Children=&lt;br /&gt;
&lt;br /&gt;
This script will get a list of all the groups that you currently have selected and then it will select all of their child groups and deselect the parent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#called when the addon is selected in the addon's menu&lt;br /&gt;
def onExecute():&lt;br /&gt;
	#get list of selected groups&lt;br /&gt;
	groupList = api.groups.getSelectedGroups()&lt;br /&gt;
&lt;br /&gt;
	if groupList != None:&lt;br /&gt;
		for group in groupList:&lt;br /&gt;
			selectChildren(group)&lt;br /&gt;
&lt;br /&gt;
#select all the children for a given group			&lt;br /&gt;
def selectChildren(groupPath):&lt;br /&gt;
	childCount = api.groups.getChildCount(groupPath)&lt;br /&gt;
&lt;br /&gt;
	if childCount &amp;gt; 0:&lt;br /&gt;
		api.groups.deselectGroup(groupPath)&lt;br /&gt;
	&lt;br /&gt;
		for i in range(0, childCount):&lt;br /&gt;
			#build the group path for the next group&lt;br /&gt;
			newPath = groupPath&lt;br /&gt;
			if len(newPath) == 0:&lt;br /&gt;
				newPath = str(i)&lt;br /&gt;
			else:&lt;br /&gt;
				newPath = newPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
			#select group&lt;br /&gt;
			api.groups.selectGroup(newPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Lamps On=&lt;br /&gt;
This addon allows you to specify a list of profile names and the value that the lamp channel must be assigned to in order to strike the lamp for that particular fixture. This addon runs automatically on startup asking if you'd like to turn the lamps on.&lt;br /&gt;
&lt;br /&gt;
This example is a little more complicated, utilizing file operations for saving and loading settings, asynchronous processing, as well as using Windows Forms for dialog boxes to adjust the addon's settings in Lightforge. The bulk of the code is devoted to setting up the forms and laying out controls for the dialog boxes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
import clr&lt;br /&gt;
clr.AddReference(&amp;quot;System.Drawing&amp;quot;)&lt;br /&gt;
clr.AddReference(&amp;quot;System.Windows.Forms&amp;quot;)&lt;br /&gt;
from System.Drawing import Point&lt;br /&gt;
from System.Windows.Forms import Application, Button, ListView, ListViewItem, View, Form, ContextMenu, TextBox, NumericUpDown, Label&lt;br /&gt;
from System.Windows.Forms import MessageBox, MessageBoxButtons&lt;br /&gt;
from System.Windows.Forms import FormBorderStyle, DialogResult&lt;br /&gt;
&lt;br /&gt;
profilesAndValues = []&lt;br /&gt;
&lt;br /&gt;
#called when the script is loaded&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	load()&lt;br /&gt;
	&lt;br /&gt;
#called when the script settings are edited in the script settings dialog&lt;br /&gt;
def onEdit():&lt;br /&gt;
	dlg = LampOnDialog()&lt;br /&gt;
	if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
		save()&lt;br /&gt;
&lt;br /&gt;
#executes asyncronously when clicked from the Lightforge interface		&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	onStartupAsync()&lt;br /&gt;
&lt;br /&gt;
#called as Lightforge is starting up&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	if MessageBox.Show(&amp;quot;Would you like to turn lamps on?&amp;quot;, &amp;quot;Lamp Startup&amp;quot;, MessageBoxButtons.YesNo) == DialogResult.Yes:&lt;br /&gt;
		print(&amp;quot;&amp;quot;)&lt;br /&gt;
		print(&amp;quot;Turning Lamps On&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		#find profiles that match those in our profilesAndValues list and set values appropriately&lt;br /&gt;
		findProfiles(&amp;quot;&amp;quot;, profilesAndValues)&lt;br /&gt;
		&lt;br /&gt;
		#wait 5 seconds to allow the fixtures to process the command&lt;br /&gt;
		print(&amp;quot;Waiting...&amp;quot;)&lt;br /&gt;
		api.wait(5)&lt;br /&gt;
		&lt;br /&gt;
		#release the rig to remove the changes we made&lt;br /&gt;
		print(&amp;quot;Releasing Fixtures&amp;quot;)&lt;br /&gt;
		api.groups.releaseGroup(&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
#Search through rig to find the specified profiles and assign them the given values&lt;br /&gt;
def findProfiles(groupPath, profileList):&lt;br /&gt;
	currentPath = groupPath&lt;br /&gt;
&lt;br /&gt;
	#step through all children of the current group&lt;br /&gt;
	for i in range(0, api.groups.getChildCount(currentPath)):&lt;br /&gt;
		#build the group path for the next group&lt;br /&gt;
		if len(currentPath) == 0:&lt;br /&gt;
			currentPath = str(i)&lt;br /&gt;
		else:&lt;br /&gt;
			currentPath = groupPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
&lt;br /&gt;
		found = False&lt;br /&gt;
		&lt;br /&gt;
		#step through all the profiles we've listed to see if this fixture's profile matches  any of them&lt;br /&gt;
		for prf in profileList:		&lt;br /&gt;
			if prf[0] in api.groups.getProfileName(currentPath):&lt;br /&gt;
				#set the value of this fixture to the value in the profile list&lt;br /&gt;
				api.groups.setAttribute(api.attributeTypes.lamp, int(prf[1]) * 256, currentPath)&lt;br /&gt;
				found = True&lt;br /&gt;
				&lt;br /&gt;
		#call this function on the tested group to work recursively through the groups&lt;br /&gt;
		if found == False and api.groups.getChildCount(currentPath) &amp;gt; 0:&lt;br /&gt;
			findProfiles(currentPath, profileList)&lt;br /&gt;
&lt;br /&gt;
#Save settings to file&lt;br /&gt;
def save():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	strOutput = &amp;quot;&amp;quot;&lt;br /&gt;
	for prf in profilesAndValues:&lt;br /&gt;
		strOutput += prf[0] + &amp;quot;;&amp;quot; + str(prf[1]) + &amp;quot;\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	f = open(addon.getDirectory() + &amp;quot;Lamps On.settings&amp;quot;, &amp;quot;w+&amp;quot;)&lt;br /&gt;
	f.write(strOutput)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
#Load settings in from file	&lt;br /&gt;
def load():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	profilesAndValues = []&lt;br /&gt;
	try:&lt;br /&gt;
		f = open(addon.getDirectory() + &amp;quot;Lamps On.settings&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
		for line in f:&lt;br /&gt;
			profilesAndValues.append(line.rstrip().split(';'))&lt;br /&gt;
		f.close()&lt;br /&gt;
	except: &lt;br /&gt;
		pass&lt;br /&gt;
	&lt;br /&gt;
#Dialog box for assigning values to profiles			&lt;br /&gt;
class LampOnDialog(Form):&lt;br /&gt;
&lt;br /&gt;
	def __init__(self):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.Text = 'Lamp On Settings'&lt;br /&gt;
		self.FormBorderStyle = FormBorderStyle.FixedDialog&lt;br /&gt;
		self.MinimizeBox = False&lt;br /&gt;
		self.MaximizeBox = False&lt;br /&gt;
		&lt;br /&gt;
		margin = 10&lt;br /&gt;
		&lt;br /&gt;
		#Cancel Button&lt;br /&gt;
		btnCancel = Button()&lt;br /&gt;
		btnCancel.Text = &amp;quot;Cancel&amp;quot;&lt;br /&gt;
		btnCancel.Location = Point(self.ClientRectangle.Right - (btnCancel.Width + margin), self.ClientRectangle.Bottom - (btnCancel.Height + margin))&lt;br /&gt;
		btnCancel.Click += self.clickCancel&lt;br /&gt;
		self.Controls.Add(btnCancel)&lt;br /&gt;
		&lt;br /&gt;
		#Ok Button&lt;br /&gt;
		btnOk = Button()&lt;br /&gt;
		btnOk.Text = &amp;quot;Ok&amp;quot;&lt;br /&gt;
		btnOk.Location = Point(btnCancel.Left - (btnOk.Width + margin), self.ClientRectangle.Bottom - (btnOk.Height + margin))&lt;br /&gt;
		btnOk.Click += self.clickOk&lt;br /&gt;
		self.Controls.Add(btnOk)&lt;br /&gt;
		&lt;br /&gt;
		#List Box&lt;br /&gt;
		self.lstProfiles = ListView()&lt;br /&gt;
		self.lstProfiles.Location = Point(margin, margin)&lt;br /&gt;
		self.lstProfiles.Width = self.ClientRectangle.Width - (margin * 2)&lt;br /&gt;
		self.lstProfiles.Height = btnOk.Top - (margin * 2)&lt;br /&gt;
		self.Controls.Add(self.lstProfiles)&lt;br /&gt;
		self.lstProfiles.View = View.Details&lt;br /&gt;
		self.lstProfiles.Columns.Add(&amp;quot;Profile&amp;quot;)&lt;br /&gt;
		self.lstProfiles.Columns.Add(&amp;quot;Value&amp;quot;)	&lt;br /&gt;
		self.lstProfiles.Columns[0].Width = self.lstProfiles.Width * 0.7&lt;br /&gt;
		self.refreshList()&lt;br /&gt;
		&lt;br /&gt;
		#Context Menu&lt;br /&gt;
		listContext = ContextMenu()&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Add Profile&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[0].Click += self.addProfile&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Edit&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[1].Click += self.editProfile&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Remove&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[2].Click += self.removeProfile&lt;br /&gt;
		self.lstProfiles.ContextMenu = listContext&lt;br /&gt;
	&lt;br /&gt;
	#reload the profilesAndValues data into the ListView control&lt;br /&gt;
	def refreshList(self):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.lstProfiles.Items.Clear()&lt;br /&gt;
		for prf in profilesAndValues:&lt;br /&gt;
			lvItem = ListViewItem(prf[0])&lt;br /&gt;
			lvItem.SubItems.Add(str(prf[1]))&lt;br /&gt;
			self.lstProfiles.Items.Add(lvItem)&lt;br /&gt;
	&lt;br /&gt;
	#handle Ok button click&lt;br /&gt;
	def clickOk(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.OK&lt;br /&gt;
		self.Close&lt;br /&gt;
		&lt;br /&gt;
	#handle Cancel button click	&lt;br /&gt;
	def clickCancel(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.Cancel&lt;br /&gt;
		self.Close&lt;br /&gt;
&lt;br /&gt;
	#add profile called from the context menu	&lt;br /&gt;
	def addProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		dlg = ProfileValueDialog(&amp;quot;&amp;quot;,0)&lt;br /&gt;
		if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
			profilesAndValues.append([dlg.profile,dlg.value])&lt;br /&gt;
			self.refreshList()&lt;br /&gt;
	&lt;br /&gt;
	#remove profile called from the context menu	&lt;br /&gt;
	def removeProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		if self.lstProfiles.SelectedIndices.Count &amp;gt; 0:&lt;br /&gt;
			profilesAndValues.pop(self.lstProfiles.SelectedIndices[0])&lt;br /&gt;
			self.refreshList()&lt;br /&gt;
		&lt;br /&gt;
	#edit profile called from the context menu	&lt;br /&gt;
	def editProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		if self.lstProfiles.SelectedIndices.Count &amp;gt; 0:&lt;br /&gt;
			index = self.lstProfiles.SelectedIndices[0]&lt;br /&gt;
			dlg = ProfileValueDialog(profilesAndValues[index][0],profilesAndValues[index][1])&lt;br /&gt;
			if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
				profilesAndValues[index] = [dlg.profile,dlg.value]&lt;br /&gt;
				self.refreshList()&lt;br /&gt;
&lt;br /&gt;
				&lt;br /&gt;
#Dialog box for assigning values to profiles			&lt;br /&gt;
class ProfileValueDialog(Form):&lt;br /&gt;
&lt;br /&gt;
	profile = &amp;quot;&amp;quot;&lt;br /&gt;
	value = 0&lt;br /&gt;
&lt;br /&gt;
	def __init__(self, profileName, lampValue):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.Text = 'Profile Value Dialog'&lt;br /&gt;
		self.FormBorderStyle = FormBorderStyle.FixedDialog&lt;br /&gt;
		self.MinimizeBox = False&lt;br /&gt;
		self.MaximizeBox = False&lt;br /&gt;
		&lt;br /&gt;
		margin = 10&lt;br /&gt;
		&lt;br /&gt;
		self.Width = 350&lt;br /&gt;
		self.Height = 150&lt;br /&gt;
		&lt;br /&gt;
		#Label&lt;br /&gt;
		lblPrompt = Label()&lt;br /&gt;
		lblPrompt.Text = &amp;quot;Enter profile name and 8 bit value for lamp on.&amp;quot;&lt;br /&gt;
		lblPrompt.Location = Point(margin, margin)&lt;br /&gt;
		lblPrompt.Width = self.Width&lt;br /&gt;
		self.Controls.Add(lblPrompt)&lt;br /&gt;
		&lt;br /&gt;
		#Text Box&lt;br /&gt;
		self.txtProfile = TextBox()&lt;br /&gt;
		self.txtProfile.Location = Point(margin, margin * 4)&lt;br /&gt;
		self.txtProfile.Text = profileName&lt;br /&gt;
		self.txtProfile.Width = 200&lt;br /&gt;
		self.Controls.Add(self.txtProfile)&lt;br /&gt;
		&lt;br /&gt;
		#NumericUpDown&lt;br /&gt;
		self.numValue = NumericUpDown()&lt;br /&gt;
		self.numValue.Maximum = 255&lt;br /&gt;
		self.numValue.Value = lampValue&lt;br /&gt;
		self.numValue.Location = Point(self.txtProfile.Right + margin, self.txtProfile.Top)&lt;br /&gt;
		self.numValue.Width = (self.Width - margin) - (self.txtProfile.Right + (margin * 3))&lt;br /&gt;
		self.Controls.Add(self.numValue)&lt;br /&gt;
		&lt;br /&gt;
		#Cancel Button&lt;br /&gt;
		btnCancel = Button()&lt;br /&gt;
		btnCancel.Text = &amp;quot;Cancel&amp;quot;&lt;br /&gt;
		btnCancel.Location = Point(self.ClientRectangle.Right - (btnCancel.Width + margin), self.ClientRectangle.Bottom - (btnCancel.Height + margin))&lt;br /&gt;
		btnCancel.Click += self.clickCancel&lt;br /&gt;
		self.Controls.Add(btnCancel)&lt;br /&gt;
		&lt;br /&gt;
		#Ok Button&lt;br /&gt;
		btnOk = Button()&lt;br /&gt;
		btnOk.Text = &amp;quot;Ok&amp;quot;&lt;br /&gt;
		btnOk.Location = Point(btnCancel.Left - (btnOk.Width + margin), self.ClientRectangle.Bottom - (btnOk.Height + margin))&lt;br /&gt;
		btnOk.Click += self.clickOk&lt;br /&gt;
		self.Controls.Add(btnOk)&lt;br /&gt;
		&lt;br /&gt;
	def clickOk(self, sender, args):&lt;br /&gt;
		self.profile = self.txtProfile.Text&lt;br /&gt;
		self.value = self.numValue.Value&lt;br /&gt;
		self.DialogResult = DialogResult.OK&lt;br /&gt;
		self.Close&lt;br /&gt;
		&lt;br /&gt;
	def clickCancel(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.Cancel&lt;br /&gt;
		self.Close&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons</id>
		<title>Sample Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons"/>
				<updated>2013-05-09T23:35:37Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Lamps On */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Select Children=&lt;br /&gt;
&lt;br /&gt;
This script will get a list of all the groups that you currently have selected and then it will select all of their child groups and deselect the parent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#called when the addon is selected in the addon's menu&lt;br /&gt;
def onExecute():&lt;br /&gt;
	#get list of selected groups&lt;br /&gt;
	groupList = api.groups.getSelectedGroups()&lt;br /&gt;
&lt;br /&gt;
	if groupList != None:&lt;br /&gt;
		for group in groupList:&lt;br /&gt;
			selectChildren(group)&lt;br /&gt;
&lt;br /&gt;
#select all the children for a given group			&lt;br /&gt;
def selectChildren(groupPath):&lt;br /&gt;
	childCount = api.groups.getChildCount(groupPath)&lt;br /&gt;
&lt;br /&gt;
	if childCount &amp;gt; 0:&lt;br /&gt;
		api.groups.deselectGroup(groupPath)&lt;br /&gt;
	&lt;br /&gt;
		for i in range(0, childCount):&lt;br /&gt;
			#build the group path for the next group&lt;br /&gt;
			newPath = groupPath&lt;br /&gt;
			if len(newPath) == 0:&lt;br /&gt;
				newPath = str(i)&lt;br /&gt;
			else:&lt;br /&gt;
				newPath = newPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
			#select group&lt;br /&gt;
			api.groups.selectGroup(newPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Lamps On=&lt;br /&gt;
This addon allows you to specify a list of profile names and the value that the lamp channel must be assigned to in order to strike the lamp for that particular fixture. This addon runs automatically on startup asking if you'd like to turn the lamps on.&lt;br /&gt;
&lt;br /&gt;
This example is a little more complicated, utilizing file operations for saving and loading settings, asynchronous processing, as well as using Windows Forms for dialog boxes to adjust the addon's settings in Lightforge.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
import clr&lt;br /&gt;
clr.AddReference(&amp;quot;System.Drawing&amp;quot;)&lt;br /&gt;
clr.AddReference(&amp;quot;System.Windows.Forms&amp;quot;)&lt;br /&gt;
from System.Drawing import Point&lt;br /&gt;
from System.Windows.Forms import Application, Button, ListView, ListViewItem, View, Form, ContextMenu, TextBox, NumericUpDown, Label&lt;br /&gt;
from System.Windows.Forms import MessageBox, MessageBoxButtons&lt;br /&gt;
from System.Windows.Forms import FormBorderStyle, DialogResult&lt;br /&gt;
&lt;br /&gt;
profilesAndValues = []&lt;br /&gt;
&lt;br /&gt;
#called when the script is loaded&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	load()&lt;br /&gt;
	&lt;br /&gt;
#called when the script settings are edited in the script settings dialog&lt;br /&gt;
def onEdit():&lt;br /&gt;
	dlg = LampOnDialog()&lt;br /&gt;
	if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
		save()&lt;br /&gt;
&lt;br /&gt;
#executes asyncronously when clicked from the Lightforge interface		&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	onStartupAsync()&lt;br /&gt;
&lt;br /&gt;
#called as Lightforge is starting up&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	if MessageBox.Show(&amp;quot;Would you like to turn lamps on?&amp;quot;, &amp;quot;Lamp Startup&amp;quot;, MessageBoxButtons.YesNo) == DialogResult.Yes:&lt;br /&gt;
		print(&amp;quot;&amp;quot;)&lt;br /&gt;
		print(&amp;quot;Turning Lamps On&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		#find profiles that match those in our profilesAndValues list and set values appropriately&lt;br /&gt;
		findProfiles(&amp;quot;&amp;quot;, profilesAndValues)&lt;br /&gt;
		&lt;br /&gt;
		#wait 5 seconds to allow the fixtures to process the command&lt;br /&gt;
		print(&amp;quot;Waiting...&amp;quot;)&lt;br /&gt;
		api.wait(5)&lt;br /&gt;
		&lt;br /&gt;
		#release the rig to remove the changes we made&lt;br /&gt;
		print(&amp;quot;Releasing Fixtures&amp;quot;)&lt;br /&gt;
		api.groups.releaseGroup(&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
#Search through rig to find the specified profiles and assign them the given values&lt;br /&gt;
def findProfiles(groupPath, profileList):&lt;br /&gt;
	currentPath = groupPath&lt;br /&gt;
&lt;br /&gt;
	#step through all children of the current group&lt;br /&gt;
	for i in range(0, api.groups.getChildCount(currentPath)):&lt;br /&gt;
		#build the group path for the next group&lt;br /&gt;
		if len(currentPath) == 0:&lt;br /&gt;
			currentPath = str(i)&lt;br /&gt;
		else:&lt;br /&gt;
			currentPath = groupPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
&lt;br /&gt;
		found = False&lt;br /&gt;
		&lt;br /&gt;
		#step through all the profiles we've listed to see if this fixture's profile matches  any of them&lt;br /&gt;
		for prf in profileList:		&lt;br /&gt;
			if prf[0] in api.groups.getProfileName(currentPath):&lt;br /&gt;
				#set the value of this fixture to the value in the profile list&lt;br /&gt;
				api.groups.setAttribute(api.attributeTypes.lamp, int(prf[1]) * 256, currentPath)&lt;br /&gt;
				found = True&lt;br /&gt;
				&lt;br /&gt;
		#call this function on the tested group to work recursively through the groups&lt;br /&gt;
		if found == False and api.groups.getChildCount(currentPath) &amp;gt; 0:&lt;br /&gt;
			findProfiles(currentPath, profileList)&lt;br /&gt;
&lt;br /&gt;
#Save settings to file&lt;br /&gt;
def save():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	strOutput = &amp;quot;&amp;quot;&lt;br /&gt;
	for prf in profilesAndValues:&lt;br /&gt;
		strOutput += prf[0] + &amp;quot;;&amp;quot; + str(prf[1]) + &amp;quot;\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	f = open(addon.getDirectory() + &amp;quot;Lamps On.settings&amp;quot;, &amp;quot;w+&amp;quot;)&lt;br /&gt;
	f.write(strOutput)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
#Load settings in from file	&lt;br /&gt;
def load():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	profilesAndValues = []&lt;br /&gt;
	try:&lt;br /&gt;
		f = open(addon.getDirectory() + &amp;quot;Lamps On.settings&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
		for line in f:&lt;br /&gt;
			profilesAndValues.append(line.rstrip().split(';'))&lt;br /&gt;
		f.close()&lt;br /&gt;
	except: &lt;br /&gt;
		pass&lt;br /&gt;
	&lt;br /&gt;
#Dialog box for assigning values to profiles			&lt;br /&gt;
class LampOnDialog(Form):&lt;br /&gt;
&lt;br /&gt;
	def __init__(self):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.Text = 'Lamp On Settings'&lt;br /&gt;
		self.FormBorderStyle = FormBorderStyle.FixedDialog&lt;br /&gt;
		self.MinimizeBox = False&lt;br /&gt;
		self.MaximizeBox = False&lt;br /&gt;
		&lt;br /&gt;
		margin = 10&lt;br /&gt;
		&lt;br /&gt;
		#Cancel Button&lt;br /&gt;
		btnCancel = Button()&lt;br /&gt;
		btnCancel.Text = &amp;quot;Cancel&amp;quot;&lt;br /&gt;
		btnCancel.Location = Point(self.ClientRectangle.Right - (btnCancel.Width + margin), self.ClientRectangle.Bottom - (btnCancel.Height + margin))&lt;br /&gt;
		btnCancel.Click += self.clickCancel&lt;br /&gt;
		self.Controls.Add(btnCancel)&lt;br /&gt;
		&lt;br /&gt;
		#Ok Button&lt;br /&gt;
		btnOk = Button()&lt;br /&gt;
		btnOk.Text = &amp;quot;Ok&amp;quot;&lt;br /&gt;
		btnOk.Location = Point(btnCancel.Left - (btnOk.Width + margin), self.ClientRectangle.Bottom - (btnOk.Height + margin))&lt;br /&gt;
		btnOk.Click += self.clickOk&lt;br /&gt;
		self.Controls.Add(btnOk)&lt;br /&gt;
		&lt;br /&gt;
		#List Box&lt;br /&gt;
		self.lstProfiles = ListView()&lt;br /&gt;
		self.lstProfiles.Location = Point(margin, margin)&lt;br /&gt;
		self.lstProfiles.Width = self.ClientRectangle.Width - (margin * 2)&lt;br /&gt;
		self.lstProfiles.Height = btnOk.Top - (margin * 2)&lt;br /&gt;
		self.Controls.Add(self.lstProfiles)&lt;br /&gt;
		self.lstProfiles.View = View.Details&lt;br /&gt;
		self.lstProfiles.Columns.Add(&amp;quot;Profile&amp;quot;)&lt;br /&gt;
		self.lstProfiles.Columns.Add(&amp;quot;Value&amp;quot;)	&lt;br /&gt;
		self.lstProfiles.Columns[0].Width = self.lstProfiles.Width * 0.7&lt;br /&gt;
		self.refreshList()&lt;br /&gt;
		&lt;br /&gt;
		#Context Menu&lt;br /&gt;
		listContext = ContextMenu()&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Add Profile&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[0].Click += self.addProfile&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Edit&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[1].Click += self.editProfile&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Remove&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[2].Click += self.removeProfile&lt;br /&gt;
		self.lstProfiles.ContextMenu = listContext&lt;br /&gt;
	&lt;br /&gt;
	#reload the profilesAndValues data into the ListView control&lt;br /&gt;
	def refreshList(self):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.lstProfiles.Items.Clear()&lt;br /&gt;
		for prf in profilesAndValues:&lt;br /&gt;
			lvItem = ListViewItem(prf[0])&lt;br /&gt;
			lvItem.SubItems.Add(str(prf[1]))&lt;br /&gt;
			self.lstProfiles.Items.Add(lvItem)&lt;br /&gt;
	&lt;br /&gt;
	#handle Ok button click&lt;br /&gt;
	def clickOk(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.OK&lt;br /&gt;
		self.Close&lt;br /&gt;
		&lt;br /&gt;
	#handle Cancel button click	&lt;br /&gt;
	def clickCancel(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.Cancel&lt;br /&gt;
		self.Close&lt;br /&gt;
&lt;br /&gt;
	#add profile called from the context menu	&lt;br /&gt;
	def addProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		dlg = ProfileValueDialog(&amp;quot;&amp;quot;,0)&lt;br /&gt;
		if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
			profilesAndValues.append([dlg.profile,dlg.value])&lt;br /&gt;
			self.refreshList()&lt;br /&gt;
	&lt;br /&gt;
	#remove profile called from the context menu	&lt;br /&gt;
	def removeProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		if self.lstProfiles.SelectedIndices.Count &amp;gt; 0:&lt;br /&gt;
			profilesAndValues.pop(self.lstProfiles.SelectedIndices[0])&lt;br /&gt;
			self.refreshList()&lt;br /&gt;
		&lt;br /&gt;
	#edit profile called from the context menu	&lt;br /&gt;
	def editProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		if self.lstProfiles.SelectedIndices.Count &amp;gt; 0:&lt;br /&gt;
			index = self.lstProfiles.SelectedIndices[0]&lt;br /&gt;
			dlg = ProfileValueDialog(profilesAndValues[index][0],profilesAndValues[index][1])&lt;br /&gt;
			if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
				profilesAndValues[index] = [dlg.profile,dlg.value]&lt;br /&gt;
				self.refreshList()&lt;br /&gt;
&lt;br /&gt;
				&lt;br /&gt;
#Dialog box for assigning values to profiles			&lt;br /&gt;
class ProfileValueDialog(Form):&lt;br /&gt;
&lt;br /&gt;
	profile = &amp;quot;&amp;quot;&lt;br /&gt;
	value = 0&lt;br /&gt;
&lt;br /&gt;
	def __init__(self, profileName, lampValue):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.Text = 'Profile Value Dialog'&lt;br /&gt;
		self.FormBorderStyle = FormBorderStyle.FixedDialog&lt;br /&gt;
		self.MinimizeBox = False&lt;br /&gt;
		self.MaximizeBox = False&lt;br /&gt;
		&lt;br /&gt;
		margin = 10&lt;br /&gt;
		&lt;br /&gt;
		self.Width = 350&lt;br /&gt;
		self.Height = 150&lt;br /&gt;
		&lt;br /&gt;
		#Label&lt;br /&gt;
		lblPrompt = Label()&lt;br /&gt;
		lblPrompt.Text = &amp;quot;Enter profile name and 8 bit value for lamp on.&amp;quot;&lt;br /&gt;
		lblPrompt.Location = Point(margin, margin)&lt;br /&gt;
		lblPrompt.Width = self.Width&lt;br /&gt;
		self.Controls.Add(lblPrompt)&lt;br /&gt;
		&lt;br /&gt;
		#Text Box&lt;br /&gt;
		self.txtProfile = TextBox()&lt;br /&gt;
		self.txtProfile.Location = Point(margin, margin * 4)&lt;br /&gt;
		self.txtProfile.Text = profileName&lt;br /&gt;
		self.txtProfile.Width = 200&lt;br /&gt;
		self.Controls.Add(self.txtProfile)&lt;br /&gt;
		&lt;br /&gt;
		#NumericUpDown&lt;br /&gt;
		self.numValue = NumericUpDown()&lt;br /&gt;
		self.numValue.Maximum = 255&lt;br /&gt;
		self.numValue.Value = lampValue&lt;br /&gt;
		self.numValue.Location = Point(self.txtProfile.Right + margin, self.txtProfile.Top)&lt;br /&gt;
		self.numValue.Width = (self.Width - margin) - (self.txtProfile.Right + (margin * 3))&lt;br /&gt;
		self.Controls.Add(self.numValue)&lt;br /&gt;
		&lt;br /&gt;
		#Cancel Button&lt;br /&gt;
		btnCancel = Button()&lt;br /&gt;
		btnCancel.Text = &amp;quot;Cancel&amp;quot;&lt;br /&gt;
		btnCancel.Location = Point(self.ClientRectangle.Right - (btnCancel.Width + margin), self.ClientRectangle.Bottom - (btnCancel.Height + margin))&lt;br /&gt;
		btnCancel.Click += self.clickCancel&lt;br /&gt;
		self.Controls.Add(btnCancel)&lt;br /&gt;
		&lt;br /&gt;
		#Ok Button&lt;br /&gt;
		btnOk = Button()&lt;br /&gt;
		btnOk.Text = &amp;quot;Ok&amp;quot;&lt;br /&gt;
		btnOk.Location = Point(btnCancel.Left - (btnOk.Width + margin), self.ClientRectangle.Bottom - (btnOk.Height + margin))&lt;br /&gt;
		btnOk.Click += self.clickOk&lt;br /&gt;
		self.Controls.Add(btnOk)&lt;br /&gt;
		&lt;br /&gt;
	def clickOk(self, sender, args):&lt;br /&gt;
		self.profile = self.txtProfile.Text&lt;br /&gt;
		self.value = self.numValue.Value&lt;br /&gt;
		self.DialogResult = DialogResult.OK&lt;br /&gt;
		self.Close&lt;br /&gt;
		&lt;br /&gt;
	def clickCancel(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.Cancel&lt;br /&gt;
		self.Close&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons</id>
		<title>Sample Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons"/>
				<updated>2013-05-09T23:29:26Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Select Children */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Select Children=&lt;br /&gt;
&lt;br /&gt;
This script will get a list of all the groups that you currently have selected and then it will select all of their child groups and deselect the parent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#called when the addon is selected in the addon's menu&lt;br /&gt;
def onExecute():&lt;br /&gt;
	#get list of selected groups&lt;br /&gt;
	groupList = api.groups.getSelectedGroups()&lt;br /&gt;
&lt;br /&gt;
	if groupList != None:&lt;br /&gt;
		for group in groupList:&lt;br /&gt;
			selectChildren(group)&lt;br /&gt;
&lt;br /&gt;
#select all the children for a given group			&lt;br /&gt;
def selectChildren(groupPath):&lt;br /&gt;
	childCount = api.groups.getChildCount(groupPath)&lt;br /&gt;
&lt;br /&gt;
	if childCount &amp;gt; 0:&lt;br /&gt;
		api.groups.deselectGroup(groupPath)&lt;br /&gt;
	&lt;br /&gt;
		for i in range(0, childCount):&lt;br /&gt;
			#build the group path for the next group&lt;br /&gt;
			newPath = groupPath&lt;br /&gt;
			if len(newPath) == 0:&lt;br /&gt;
				newPath = str(i)&lt;br /&gt;
			else:&lt;br /&gt;
				newPath = newPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
			#select group&lt;br /&gt;
			api.groups.selectGroup(newPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Lamps On=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
import clr&lt;br /&gt;
clr.AddReference(&amp;quot;System.Drawing&amp;quot;)&lt;br /&gt;
clr.AddReference(&amp;quot;System.Windows.Forms&amp;quot;)&lt;br /&gt;
from System.Drawing import Point&lt;br /&gt;
from System.Windows.Forms import Application, Button, ListView, ListViewItem, View, Form, ContextMenu, TextBox, NumericUpDown, Label&lt;br /&gt;
from System.Windows.Forms import MessageBox, MessageBoxButtons&lt;br /&gt;
from System.Windows.Forms import FormBorderStyle, DialogResult&lt;br /&gt;
&lt;br /&gt;
profilesAndValues = []&lt;br /&gt;
&lt;br /&gt;
#called when the script is loaded&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	load()&lt;br /&gt;
	&lt;br /&gt;
#called when the script settings are edited in the script settings dialog&lt;br /&gt;
def onEdit():&lt;br /&gt;
	dlg = LampOnDialog()&lt;br /&gt;
	if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
		save()&lt;br /&gt;
&lt;br /&gt;
#executes asyncronously when clicked from the Lightforge interface		&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	onStartupAsync()&lt;br /&gt;
&lt;br /&gt;
#called as Lightforge is starting up&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	if MessageBox.Show(&amp;quot;Would you like to turn lamps on?&amp;quot;, &amp;quot;Lamp Startup&amp;quot;, MessageBoxButtons.YesNo) == DialogResult.Yes:&lt;br /&gt;
		print(&amp;quot;&amp;quot;)&lt;br /&gt;
		print(&amp;quot;Turning Lamps On&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		#find profiles that match those in our profilesAndValues list and set values appropriately&lt;br /&gt;
		findProfiles(&amp;quot;&amp;quot;, profilesAndValues)&lt;br /&gt;
		&lt;br /&gt;
		#wait 5 seconds to allow the fixtures to process the command&lt;br /&gt;
		print(&amp;quot;Waiting...&amp;quot;)&lt;br /&gt;
		api.wait(5)&lt;br /&gt;
		&lt;br /&gt;
		#release the rig to remove the changes we made&lt;br /&gt;
		print(&amp;quot;Releasing Fixtures&amp;quot;)&lt;br /&gt;
		api.groups.releaseGroup(&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
#Search through rig to find the specified profiles and assign them the given values&lt;br /&gt;
def findProfiles(groupPath, profileList):&lt;br /&gt;
	currentPath = groupPath&lt;br /&gt;
&lt;br /&gt;
	#step through all children of the current group&lt;br /&gt;
	for i in range(0, api.groups.getChildCount(currentPath)):&lt;br /&gt;
		#build the group path for the next group&lt;br /&gt;
		if len(currentPath) == 0:&lt;br /&gt;
			currentPath = str(i)&lt;br /&gt;
		else:&lt;br /&gt;
			currentPath = groupPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
&lt;br /&gt;
		found = False&lt;br /&gt;
		&lt;br /&gt;
		#step through all the profiles we've listed to see if this fixture's profile matches  any of them&lt;br /&gt;
		for prf in profileList:		&lt;br /&gt;
			if prf[0] in api.groups.getProfileName(currentPath):&lt;br /&gt;
				#set the value of this fixture to the value in the profile list&lt;br /&gt;
				api.groups.setAttribute(api.attributeTypes.lamp, int(prf[1]) * 256, currentPath)&lt;br /&gt;
				found = True&lt;br /&gt;
				&lt;br /&gt;
		#call this function on the tested group to work recursively through the groups&lt;br /&gt;
		if found == False and api.groups.getChildCount(currentPath) &amp;gt; 0:&lt;br /&gt;
			findProfiles(currentPath, profileList)&lt;br /&gt;
&lt;br /&gt;
#Save settings to file&lt;br /&gt;
def save():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	strOutput = &amp;quot;&amp;quot;&lt;br /&gt;
	for prf in profilesAndValues:&lt;br /&gt;
		strOutput += prf[0] + &amp;quot;;&amp;quot; + str(prf[1]) + &amp;quot;\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	f = open(addon.getDirectory() + &amp;quot;Lamps On.settings&amp;quot;, &amp;quot;w+&amp;quot;)&lt;br /&gt;
	f.write(strOutput)&lt;br /&gt;
	f.close()&lt;br /&gt;
&lt;br /&gt;
#Load settings in from file	&lt;br /&gt;
def load():&lt;br /&gt;
	global profilesAndValues&lt;br /&gt;
	profilesAndValues = []&lt;br /&gt;
	try:&lt;br /&gt;
		f = open(addon.getDirectory() + &amp;quot;Lamps On.settings&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
		for line in f:&lt;br /&gt;
			profilesAndValues.append(line.rstrip().split(';'))&lt;br /&gt;
		f.close()&lt;br /&gt;
	except: &lt;br /&gt;
		pass&lt;br /&gt;
	&lt;br /&gt;
#Dialog box for assigning values to profiles			&lt;br /&gt;
class LampOnDialog(Form):&lt;br /&gt;
&lt;br /&gt;
	def __init__(self):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.Text = 'Lamp On Settings'&lt;br /&gt;
		self.FormBorderStyle = FormBorderStyle.FixedDialog&lt;br /&gt;
		self.MinimizeBox = False&lt;br /&gt;
		self.MaximizeBox = False&lt;br /&gt;
		&lt;br /&gt;
		margin = 10&lt;br /&gt;
		&lt;br /&gt;
		#Cancel Button&lt;br /&gt;
		btnCancel = Button()&lt;br /&gt;
		btnCancel.Text = &amp;quot;Cancel&amp;quot;&lt;br /&gt;
		btnCancel.Location = Point(self.ClientRectangle.Right - (btnCancel.Width + margin), self.ClientRectangle.Bottom - (btnCancel.Height + margin))&lt;br /&gt;
		btnCancel.Click += self.clickCancel&lt;br /&gt;
		self.Controls.Add(btnCancel)&lt;br /&gt;
		&lt;br /&gt;
		#Ok Button&lt;br /&gt;
		btnOk = Button()&lt;br /&gt;
		btnOk.Text = &amp;quot;Ok&amp;quot;&lt;br /&gt;
		btnOk.Location = Point(btnCancel.Left - (btnOk.Width + margin), self.ClientRectangle.Bottom - (btnOk.Height + margin))&lt;br /&gt;
		btnOk.Click += self.clickOk&lt;br /&gt;
		self.Controls.Add(btnOk)&lt;br /&gt;
		&lt;br /&gt;
		#List Box&lt;br /&gt;
		self.lstProfiles = ListView()&lt;br /&gt;
		self.lstProfiles.Location = Point(margin, margin)&lt;br /&gt;
		self.lstProfiles.Width = self.ClientRectangle.Width - (margin * 2)&lt;br /&gt;
		self.lstProfiles.Height = btnOk.Top - (margin * 2)&lt;br /&gt;
		self.Controls.Add(self.lstProfiles)&lt;br /&gt;
		self.lstProfiles.View = View.Details&lt;br /&gt;
		self.lstProfiles.Columns.Add(&amp;quot;Profile&amp;quot;)&lt;br /&gt;
		self.lstProfiles.Columns.Add(&amp;quot;Value&amp;quot;)	&lt;br /&gt;
		self.lstProfiles.Columns[0].Width = self.lstProfiles.Width * 0.7&lt;br /&gt;
		self.refreshList()&lt;br /&gt;
		&lt;br /&gt;
		#Context Menu&lt;br /&gt;
		listContext = ContextMenu()&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Add Profile&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[0].Click += self.addProfile&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Edit&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[1].Click += self.editProfile&lt;br /&gt;
		listContext.MenuItems.Add(&amp;quot;Remove&amp;quot;)&lt;br /&gt;
		listContext.MenuItems[2].Click += self.removeProfile&lt;br /&gt;
		self.lstProfiles.ContextMenu = listContext&lt;br /&gt;
	&lt;br /&gt;
	#reload the profilesAndValues data into the ListView control&lt;br /&gt;
	def refreshList(self):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.lstProfiles.Items.Clear()&lt;br /&gt;
		for prf in profilesAndValues:&lt;br /&gt;
			lvItem = ListViewItem(prf[0])&lt;br /&gt;
			lvItem.SubItems.Add(str(prf[1]))&lt;br /&gt;
			self.lstProfiles.Items.Add(lvItem)&lt;br /&gt;
	&lt;br /&gt;
	#handle Ok button click&lt;br /&gt;
	def clickOk(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.OK&lt;br /&gt;
		self.Close&lt;br /&gt;
		&lt;br /&gt;
	#handle Cancel button click	&lt;br /&gt;
	def clickCancel(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.Cancel&lt;br /&gt;
		self.Close&lt;br /&gt;
&lt;br /&gt;
	#add profile called from the context menu	&lt;br /&gt;
	def addProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		dlg = ProfileValueDialog(&amp;quot;&amp;quot;,0)&lt;br /&gt;
		if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
			profilesAndValues.append([dlg.profile,dlg.value])&lt;br /&gt;
			self.refreshList()&lt;br /&gt;
	&lt;br /&gt;
	#remove profile called from the context menu	&lt;br /&gt;
	def removeProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		if self.lstProfiles.SelectedIndices.Count &amp;gt; 0:&lt;br /&gt;
			profilesAndValues.pop(self.lstProfiles.SelectedIndices[0])&lt;br /&gt;
			self.refreshList()&lt;br /&gt;
		&lt;br /&gt;
	#edit profile called from the context menu	&lt;br /&gt;
	def editProfile(self, sender, args):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		if self.lstProfiles.SelectedIndices.Count &amp;gt; 0:&lt;br /&gt;
			index = self.lstProfiles.SelectedIndices[0]&lt;br /&gt;
			dlg = ProfileValueDialog(profilesAndValues[index][0],profilesAndValues[index][1])&lt;br /&gt;
			if dlg.ShowDialog() == DialogResult.OK:&lt;br /&gt;
				profilesAndValues[index] = [dlg.profile,dlg.value]&lt;br /&gt;
				self.refreshList()&lt;br /&gt;
&lt;br /&gt;
				&lt;br /&gt;
#Dialog box for assigning values to profiles			&lt;br /&gt;
class ProfileValueDialog(Form):&lt;br /&gt;
&lt;br /&gt;
	profile = &amp;quot;&amp;quot;&lt;br /&gt;
	value = 0&lt;br /&gt;
&lt;br /&gt;
	def __init__(self, profileName, lampValue):&lt;br /&gt;
		global profilesAndValues&lt;br /&gt;
		self.Text = 'Profile Value Dialog'&lt;br /&gt;
		self.FormBorderStyle = FormBorderStyle.FixedDialog&lt;br /&gt;
		self.MinimizeBox = False&lt;br /&gt;
		self.MaximizeBox = False&lt;br /&gt;
		&lt;br /&gt;
		margin = 10&lt;br /&gt;
		&lt;br /&gt;
		self.Width = 350&lt;br /&gt;
		self.Height = 150&lt;br /&gt;
		&lt;br /&gt;
		#Label&lt;br /&gt;
		lblPrompt = Label()&lt;br /&gt;
		lblPrompt.Text = &amp;quot;Enter profile name and 8 bit value for lamp on.&amp;quot;&lt;br /&gt;
		lblPrompt.Location = Point(margin, margin)&lt;br /&gt;
		lblPrompt.Width = self.Width&lt;br /&gt;
		self.Controls.Add(lblPrompt)&lt;br /&gt;
		&lt;br /&gt;
		#Text Box&lt;br /&gt;
		self.txtProfile = TextBox()&lt;br /&gt;
		self.txtProfile.Location = Point(margin, margin * 4)&lt;br /&gt;
		self.txtProfile.Text = profileName&lt;br /&gt;
		self.txtProfile.Width = 200&lt;br /&gt;
		self.Controls.Add(self.txtProfile)&lt;br /&gt;
		&lt;br /&gt;
		#NumericUpDown&lt;br /&gt;
		self.numValue = NumericUpDown()&lt;br /&gt;
		self.numValue.Maximum = 255&lt;br /&gt;
		self.numValue.Value = lampValue&lt;br /&gt;
		self.numValue.Location = Point(self.txtProfile.Right + margin, self.txtProfile.Top)&lt;br /&gt;
		self.numValue.Width = (self.Width - margin) - (self.txtProfile.Right + (margin * 3))&lt;br /&gt;
		self.Controls.Add(self.numValue)&lt;br /&gt;
		&lt;br /&gt;
		#Cancel Button&lt;br /&gt;
		btnCancel = Button()&lt;br /&gt;
		btnCancel.Text = &amp;quot;Cancel&amp;quot;&lt;br /&gt;
		btnCancel.Location = Point(self.ClientRectangle.Right - (btnCancel.Width + margin), self.ClientRectangle.Bottom - (btnCancel.Height + margin))&lt;br /&gt;
		btnCancel.Click += self.clickCancel&lt;br /&gt;
		self.Controls.Add(btnCancel)&lt;br /&gt;
		&lt;br /&gt;
		#Ok Button&lt;br /&gt;
		btnOk = Button()&lt;br /&gt;
		btnOk.Text = &amp;quot;Ok&amp;quot;&lt;br /&gt;
		btnOk.Location = Point(btnCancel.Left - (btnOk.Width + margin), self.ClientRectangle.Bottom - (btnOk.Height + margin))&lt;br /&gt;
		btnOk.Click += self.clickOk&lt;br /&gt;
		self.Controls.Add(btnOk)&lt;br /&gt;
		&lt;br /&gt;
	def clickOk(self, sender, args):&lt;br /&gt;
		self.profile = self.txtProfile.Text&lt;br /&gt;
		self.value = self.numValue.Value&lt;br /&gt;
		self.DialogResult = DialogResult.OK&lt;br /&gt;
		self.Close&lt;br /&gt;
		&lt;br /&gt;
	def clickCancel(self, sender, args):&lt;br /&gt;
		self.DialogResult = DialogResult.Cancel&lt;br /&gt;
		self.Close&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons</id>
		<title>Sample Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons"/>
				<updated>2013-05-09T23:26:23Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Select Children */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Select Children=&lt;br /&gt;
&lt;br /&gt;
This script will get a list of all the groups that you currently have selected and then it will select all of their child groups and deselect the parent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#called when the addon is selected in the addon's menu&lt;br /&gt;
def onExecute():&lt;br /&gt;
	#get list of selected groups&lt;br /&gt;
	groupList = api.groups.getSelectedGroups()&lt;br /&gt;
&lt;br /&gt;
	if groupList != None:&lt;br /&gt;
		for group in groupList:&lt;br /&gt;
			selectChildren(group)&lt;br /&gt;
&lt;br /&gt;
#select all the children for a given group			&lt;br /&gt;
def selectChildren(groupPath):&lt;br /&gt;
	childCount = api.groups.getChildCount(groupPath)&lt;br /&gt;
&lt;br /&gt;
	if childCount &amp;gt; 0:&lt;br /&gt;
		api.groups.deselectGroup(groupPath)&lt;br /&gt;
	&lt;br /&gt;
		for i in range(0, childCount):&lt;br /&gt;
			#build the group path for the next group&lt;br /&gt;
			newPath = groupPath&lt;br /&gt;
			if len(newPath) == 0:&lt;br /&gt;
				newPath = str(i)&lt;br /&gt;
			else:&lt;br /&gt;
				newPath = newPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
			#select group&lt;br /&gt;
			api.groups.selectGroup(newPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons</id>
		<title>Sample Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons"/>
				<updated>2013-05-09T23:26:01Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Select Children */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Select Children=&lt;br /&gt;
&lt;br /&gt;
This script will get a list of all the groups that you currently have selected and then it will select all of their child groups and deselect the parent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#called when the addon is selected in the addon's menu&lt;br /&gt;
def onExecute():&lt;br /&gt;
	#get list of selected groups&lt;br /&gt;
	groupList = api.groups.getSelectedGroups()&lt;br /&gt;
&lt;br /&gt;
	if groupList != None:&lt;br /&gt;
		for group in groupList:&lt;br /&gt;
			selectChildren(group)&lt;br /&gt;
&lt;br /&gt;
#select all the children for a given group			&lt;br /&gt;
def selectChildren(groupPath):&lt;br /&gt;
	childCount = api.groups.getChildCount(groupPath)&lt;br /&gt;
&lt;br /&gt;
	if childCount &amp;gt; 0:&lt;br /&gt;
		api.groups.deselectGroup(groupPath)&lt;br /&gt;
	&lt;br /&gt;
		for i in range(0, childCount):&lt;br /&gt;
			#build the group path for the next group&lt;br /&gt;
			newPath = groupPath&lt;br /&gt;
			if len(newPath) == 0:&lt;br /&gt;
				newPath = str(i)&lt;br /&gt;
			else:&lt;br /&gt;
				newPath = newPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
			&lt;br /&gt;
			api.groups.selectGroup(newPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons</id>
		<title>Sample Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons"/>
				<updated>2013-05-09T23:25:11Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Select Children */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Select Children=&lt;br /&gt;
&lt;br /&gt;
This script will get a list of all the groups that you currently have selected and then it will select all of their child groups and deselect the parent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	#get list of selected groups&lt;br /&gt;
	groupList = api.groups.getSelectedGroups()&lt;br /&gt;
&lt;br /&gt;
	if groupList != None:&lt;br /&gt;
		for group in groupList:&lt;br /&gt;
			selectChildren(group)&lt;br /&gt;
			&lt;br /&gt;
def selectChildren(groupPath):&lt;br /&gt;
	childCount = api.groups.getChildCount(groupPath)&lt;br /&gt;
&lt;br /&gt;
	if childCount &amp;gt; 0:&lt;br /&gt;
		api.groups.deselectGroup(groupPath)&lt;br /&gt;
	&lt;br /&gt;
	for i in range(0, childCount):&lt;br /&gt;
		#build the group path for the next group&lt;br /&gt;
		newPath = groupPath&lt;br /&gt;
		if len(newPath) == 0:&lt;br /&gt;
			newPath = str(i)&lt;br /&gt;
		else:&lt;br /&gt;
			newPath = newPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
		&lt;br /&gt;
		api.groups.selectGroup(newPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons</id>
		<title>Sample Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons"/>
				<updated>2013-05-09T23:24:00Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Select Children */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Select Children=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	#get list of selected groups&lt;br /&gt;
	groupList = api.groups.getSelectedGroups()&lt;br /&gt;
&lt;br /&gt;
	if groupList != None:&lt;br /&gt;
		for group in groupList:&lt;br /&gt;
			selectChildren(group)&lt;br /&gt;
			&lt;br /&gt;
def selectChildren(groupPath):&lt;br /&gt;
	childCount = api.groups.getChildCount(groupPath)&lt;br /&gt;
&lt;br /&gt;
	if childCount &amp;gt; 0:&lt;br /&gt;
		api.groups.deselectGroup(groupPath)&lt;br /&gt;
	&lt;br /&gt;
	for i in range(0, childCount):&lt;br /&gt;
		#build the group path for the next group&lt;br /&gt;
		newPath = groupPath&lt;br /&gt;
		if len(newPath) == 0:&lt;br /&gt;
			newPath = str(i)&lt;br /&gt;
		else:&lt;br /&gt;
			newPath = newPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
		&lt;br /&gt;
		api.groups.selectGroup(newPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons</id>
		<title>Sample Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Sample_Addons"/>
				<updated>2013-05-09T23:22:47Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: Created page with &amp;quot;=Select Children= &amp;lt;highlightsyntax lang=python&amp;gt; def onExecute(): 	#get list of selected groups 	groupList = api.groups.getSelectedGroups()  	if groupList != None: 		for group ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Select Children=&lt;br /&gt;
&amp;lt;highlightsyntax lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	#get list of selected groups&lt;br /&gt;
	groupList = api.groups.getSelectedGroups()&lt;br /&gt;
&lt;br /&gt;
	if groupList != None:&lt;br /&gt;
		for group in groupList:&lt;br /&gt;
			selectChildren(group)&lt;br /&gt;
			&lt;br /&gt;
def selectChildren(groupPath):&lt;br /&gt;
	childCount = api.groups.getChildCount(groupPath)&lt;br /&gt;
&lt;br /&gt;
	if childCount &amp;gt; 0:&lt;br /&gt;
		api.groups.deselectGroup(groupPath)&lt;br /&gt;
	&lt;br /&gt;
	for i in range(0, childCount):&lt;br /&gt;
		#build the group path for the next group&lt;br /&gt;
		newPath = groupPath&lt;br /&gt;
		if len(newPath) == 0:&lt;br /&gt;
			newPath = str(i)&lt;br /&gt;
		else:&lt;br /&gt;
			newPath = newPath + &amp;quot;,&amp;quot; + str(i) &lt;br /&gt;
		&lt;br /&gt;
		api.groups.selectGroup(newPath)&lt;br /&gt;
&amp;lt;/highlightsyntax&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T23:00:25Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Where To Go From Here */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/ www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Congratulations! You've made an addon!&lt;br /&gt;
&lt;br /&gt;
==Where To Go From Here==&lt;br /&gt;
I would suggest investigating the [[API]] and seeing what all there is to do. Also be sure to check out the [[Sample Addons]].&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T23:00:12Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/ www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Congratulations! You've made an addon!&lt;br /&gt;
&lt;br /&gt;
==Where To Go From Here==&lt;br /&gt;
I would suggest investigating the [[api]] and seeing what all there is to do. Also be sure to check out the [[Sample Addons]].&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T22:57:22Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Your First Addon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/ www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Congratulations! You've made an addon!&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T22:57:12Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Your First Addon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/ www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Congratulations! You've made an addon!&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-09T22:54:25Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Functions=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onInitialize():&lt;br /&gt;
	print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onExecuteAsync():&lt;br /&gt;
	print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartup():&lt;br /&gt;
	print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onStartupAsync():&lt;br /&gt;
	print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStart():&lt;br /&gt;
	print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onPlaybackStop():&lt;br /&gt;
	print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onFrameChange(seconds As Double):&lt;br /&gt;
	print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;	&lt;br /&gt;
def onShutdown():&lt;br /&gt;
	print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onCuelistChanged==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onCuelistChanged():&lt;br /&gt;
	print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onShowLoaded():&lt;br /&gt;
	print(&amp;quot;Show Loaded&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-09T22:51:36Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* onEdit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Functions=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onInitialize():&lt;br /&gt;
      print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
def onEdit():&lt;br /&gt;
	print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onExecute():&lt;br /&gt;
      print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onExecuteAsync():&lt;br /&gt;
      print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onStartup():&lt;br /&gt;
      print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onStartupAsync():&lt;br /&gt;
      print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onPlaybackStart():&lt;br /&gt;
      print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:   &lt;br /&gt;
   def onPlaybackStop():&lt;br /&gt;
      print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:	&lt;br /&gt;
   def onFrameChange(seconds As Double):&lt;br /&gt;
      print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:	&lt;br /&gt;
   def onShutdown():&lt;br /&gt;
      print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onCuelistChanged==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onCuelistChanged():&lt;br /&gt;
      print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onShowLoaded():&lt;br /&gt;
      print(&amp;quot;Show Loaded&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-09T22:50:50Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Functions=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.setTime(36.5)&lt;br /&gt;
print(api.getTime())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.wait(3.5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onInitialize():&lt;br /&gt;
      print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onEdit():&lt;br /&gt;
      print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onExecute():&lt;br /&gt;
      print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onExecuteAsync():&lt;br /&gt;
      print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onStartup():&lt;br /&gt;
      print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onStartupAsync():&lt;br /&gt;
      print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onPlaybackStart():&lt;br /&gt;
      print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:   &lt;br /&gt;
   def onPlaybackStop():&lt;br /&gt;
      print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:	&lt;br /&gt;
   def onFrameChange(seconds As Double):&lt;br /&gt;
      print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:	&lt;br /&gt;
   def onShutdown():&lt;br /&gt;
      print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onCuelistChanged==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onCuelistChanged():&lt;br /&gt;
      print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onShowLoaded():&lt;br /&gt;
      print(&amp;quot;Show Loaded&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.output</id>
		<title>Api.output</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.output"/>
				<updated>2013-05-09T22:33:52Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==getDMX==&lt;br /&gt;
'''getDMX(universe As Integer) As Byte()'''&lt;br /&gt;
&lt;br /&gt;
Returns a byte array containing all current dmx data for the specified universe. If the specified universe doesn't exist this function returns null.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
dmxValues = api.output.getDMX(0)&lt;br /&gt;
print(dmxValues[42])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getUniverseCount==&lt;br /&gt;
'''getUniverseCount() as Integer'''&lt;br /&gt;
&lt;br /&gt;
Returns the number of DMX universes in the current show.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
universeCount = api.output.getUniverseCount()&lt;br /&gt;
print(universeCount)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.groups</id>
		<title>Api.groups</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.groups"/>
				<updated>2013-05-09T22:32:45Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Methods */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=Information=&lt;br /&gt;
&lt;br /&gt;
==Group Paths==&lt;br /&gt;
A group path is a method for specifying a group in the group hierarchy. It is defined by use of a string. &lt;br /&gt;
&lt;br /&gt;
An empty string (&amp;quot;&amp;quot;) will specify the main group. &lt;br /&gt;
&lt;br /&gt;
To specify a child of the main group you use that child's index number ex. &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note: the indexes are 0 based so fixture 1 in a group is 0, fixture 2 is 1, etc. &lt;br /&gt;
&lt;br /&gt;
To specify a child of a child, you use a comma, and the index of the next child you want to select ex. &amp;quot;1,3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You can continue in this fashion throughout the group hierarchy. If you are looking at something nested deeply it may look like &amp;quot;1,3,0,2,4&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=Methods=&lt;br /&gt;
&lt;br /&gt;
==getAttribute==&lt;br /&gt;
&lt;br /&gt;
'''getAttribute(attribute As [[api.attributeTypes]], groupPath As String) As Integer'''&lt;br /&gt;
&lt;br /&gt;
Returns the value for a specified attribute on a specified group&lt;br /&gt;
Returns -1 if the group can't be found&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.groups.getAttribute(api.attributeTypes.intensity, &amp;quot;0,0&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getChildCount==&lt;br /&gt;
'''getChildCount(groupPath As String) As Integer'''&lt;br /&gt;
&lt;br /&gt;
Returns the number of children in a group&lt;br /&gt;
Returns -1 if the group can't be found&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.groups.getChildCount(&amp;quot;0,0&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getName==&lt;br /&gt;
'''getName(groupPath As String) As String'''&lt;br /&gt;
&lt;br /&gt;
Returns the name of the requested group&lt;br /&gt;
Returns -1 if the group can't be found&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.groups.getName(&amp;quot;1,1&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getProfileName==&lt;br /&gt;
'''getProfileName(groupPath As String) As String'''&lt;br /&gt;
&lt;br /&gt;
Returns the name of the profile in use by the specified group. If this group is not a fixture and does not have a profile this function will return -1.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
print(api.groups.getProfileName(&amp;quot;1,0,3&amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getSelectedGroups==&lt;br /&gt;
'''getSelectedGroups() As String[]'''&lt;br /&gt;
&lt;br /&gt;
Returns a list of group paths for all selected groups. If there are no groups selected then null is returned.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
groupList = api.groups.getSelectedGroups()&lt;br /&gt;
	for group in groupList:&lt;br /&gt;
		print(group)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==releaseAttribute==&lt;br /&gt;
'''releaseAttribute(attribute As [[api.attributeTypes]], groupPath As String)'''&lt;br /&gt;
&lt;br /&gt;
Releases the specified attribute on the specified group.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.groups.releaseAttribute(api.attributeTypes.intensity, &amp;quot;0,1&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==releaseGroup==&lt;br /&gt;
'''releaseGroup(groupPath As String)'''&lt;br /&gt;
&lt;br /&gt;
Releases the all attributes on the specified group.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.groups.releaseGroup(&amp;quot;1,0&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==setAttribute==&lt;br /&gt;
'''setAttribute(attribute As [[api.attributeTypes]], value As Integer, groupPath As String)'''&lt;br /&gt;
&lt;br /&gt;
Sets the value of an attribute on a specified group.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.groups.setAttribute(api.attributeTypes.intensity, 65535, &amp;quot;1,1&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==selectGroup==&lt;br /&gt;
'''selectGroup(groupPath As String)'''&lt;br /&gt;
&lt;br /&gt;
Sets the given group as selected.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.groups.selectGroup(&amp;quot;0,1,1,2&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==deselectGroup==&lt;br /&gt;
'''deselectGroup(groupPath As String)'''&lt;br /&gt;
&lt;br /&gt;
Deselects the given group.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.groups.deselectGroup(&amp;quot;0,1,1,2&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==clearSelection==&lt;br /&gt;
'''clearSelection()'''&lt;br /&gt;
&lt;br /&gt;
Deselects all selected groups.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.groups.clearSelection()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addon</id>
		<title>Addon</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addon"/>
				<updated>2013-05-09T22:28:23Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* getDirectory() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Methods=&lt;br /&gt;
&lt;br /&gt;
==getDirectory()==&lt;br /&gt;
'''getDirectory() As String'''&lt;br /&gt;
&lt;br /&gt;
This function returns the path of the current addon's folder.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
path = addon.getDirectory()&lt;br /&gt;
print(path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T22:27:03Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/ www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.cues</id>
		<title>Api.cues</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.cues"/>
				<updated>2013-05-09T22:25:42Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Methods=&lt;br /&gt;
&lt;br /&gt;
==getCuelistCount==&lt;br /&gt;
'''getCuelistCount() As Integer'''&lt;br /&gt;
&lt;br /&gt;
Returns the number of cuelists in this show.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
cuelistCount = api.cues.getCuelistCount()&lt;br /&gt;
print(cuelistCount)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getCuelistLength==&lt;br /&gt;
'''getCuelistLength() As Double'''&lt;br /&gt;
&lt;br /&gt;
Returns the length of the current cuelist in seconds or beats&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
cuelistLength = api.cues.getCuelistLength()&lt;br /&gt;
print(cuelistLength)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==getCuelistIndex==&lt;br /&gt;
'''getCuelistIndex() As Integer'''&lt;br /&gt;
&lt;br /&gt;
Returns the index of the current cuelist.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
index = api.cues.getCuelistIndex()&lt;br /&gt;
print(index)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==selectCuelist==&lt;br /&gt;
'''selectCuelist(index As Integer)'''&lt;br /&gt;
&lt;br /&gt;
Changes to a different cuelist.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=python&amp;gt;&lt;br /&gt;
api.cues.selectCuelist(2)&lt;br /&gt;
print(api.cues.getCuelistIndex())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.attributeTypes</id>
		<title>Api.attributeTypes</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Api.attributeTypes"/>
				<updated>2013-05-09T22:23:21Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=vbnet&amp;gt;&lt;br /&gt;
Enum AttributeTypes&lt;br /&gt;
	intensity&lt;br /&gt;
	pan&lt;br /&gt;
	tilt&lt;br /&gt;
	colorRed&lt;br /&gt;
	colorGreen&lt;br /&gt;
	colorBlue&lt;br /&gt;
	colorWheel_Secondary&lt;br /&gt;
	strobe&lt;br /&gt;
	gobo&lt;br /&gt;
	gobo_Rotate&lt;br /&gt;
	gobo_Secondary&lt;br /&gt;
	prism&lt;br /&gt;
	prism_Rotate&lt;br /&gt;
	focus&lt;br /&gt;
	beam&lt;br /&gt;
	zoom&lt;br /&gt;
	iris&lt;br /&gt;
	frost&lt;br /&gt;
	shutter&lt;br /&gt;
	pan_Tilt_Speed&lt;br /&gt;
	lamp&lt;br /&gt;
	macro&lt;br /&gt;
	control&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T22:20:30Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* XML Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T22:20:18Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* XML Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;addonInfo&amp;gt;&lt;br /&gt;
	&amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
	&amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
	&amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
&amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T22:19:19Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Addon Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;addonInfo&amp;gt;&lt;br /&gt;
      &amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
      &amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
   &amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T22:19:00Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Your First Addon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now in the Window menu click &amp;quot;Console&amp;quot;, this will open up the python console and you should see the text &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;addonInfo&amp;gt;&lt;br /&gt;
      &amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
      &amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
   &amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Geshi.css</id>
		<title>MediaWiki:Geshi.css</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Geshi.css"/>
				<updated>2013-05-09T22:16:27Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to GeSHi syntax highlighting */&lt;br /&gt;
div.mw-geshi {&lt;br /&gt;
  padding: 1em; &lt;br /&gt;
  margin: 1em 0; &lt;br /&gt;
  border: 1px dashed #2f6fab;&lt;br /&gt;
  background-color: #f9f9f9;&lt;br /&gt;
  font-size: 120%;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Geshi.css</id>
		<title>MediaWiki:Geshi.css</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Geshi.css"/>
				<updated>2013-05-09T22:16:07Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to GeSHi syntax highlighting */&lt;br /&gt;
div.mw-geshi {&lt;br /&gt;
  padding: 1em; &lt;br /&gt;
  margin: 1em 0; &lt;br /&gt;
  border: 1px dashed #2f6fab;&lt;br /&gt;
  background-color: #f9f9f9;&lt;br /&gt;
  font-size: 100%;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Geshi.css</id>
		<title>MediaWiki:Geshi.css</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Geshi.css"/>
				<updated>2013-05-09T22:15:12Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to GeSHi syntax highlighting */&lt;br /&gt;
div.mw-geshi {&lt;br /&gt;
  padding: 1em; &lt;br /&gt;
  margin: 1em 0; &lt;br /&gt;
  border: 1px dashed #2f6fab;&lt;br /&gt;
  background-color: #f9f9f9;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Geshi.css</id>
		<title>MediaWiki:Geshi.css</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=MediaWiki:Geshi.css"/>
				<updated>2013-05-09T21:51:40Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: Created page with &amp;quot;/* CSS placed here will be applied to GeSHi syntax highlighting */ div.mw-geshi {   padding: 1em;    margin: 1em 0;    border: 1px dashed #2f6fab;   background-color: #f9f9f9;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to GeSHi syntax highlighting */&lt;br /&gt;
div.mw-geshi {&lt;br /&gt;
  padding: 1em; &lt;br /&gt;
  margin: 1em 0; &lt;br /&gt;
  border: 1px dashed #2f6fab;&lt;br /&gt;
  background-color: #f9f9f9;&lt;br /&gt;
  font-size:150%;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T21:43:30Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Your First Addon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
	print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now In the window&lt;br /&gt;
&lt;br /&gt;
=Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;addonInfo&amp;gt;&lt;br /&gt;
      &amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
      &amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
   &amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T21:41:59Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Your First Addon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def onExecute():&lt;br /&gt;
print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now In the window&lt;br /&gt;
&lt;br /&gt;
=Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;addonInfo&amp;gt;&lt;br /&gt;
      &amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
      &amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
   &amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T21:17:46Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net]. For more information on Python in general you can visit [http://www.python.org/doc/].&lt;br /&gt;
&lt;br /&gt;
==Your First Addon==&lt;br /&gt;
To create an addon go to Addon Menu and click Addon Settings. You will find a button labeled Addon Folder. Clicking this will open up the Lightforge addon folder.&lt;br /&gt;
&lt;br /&gt;
In this folder create a new folder named &amp;quot;Hello World&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Open the Hello World folder and create a new file named base.py. Open this file with your preferred Python editor, or Notepad if you have none.&lt;br /&gt;
&lt;br /&gt;
Type the code:&lt;br /&gt;
&lt;br /&gt;
   onExecute():&lt;br /&gt;
      print(&amp;quot;Hello World!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Save the script, and return to Lightforge.&lt;br /&gt;
&lt;br /&gt;
In the Addon Settings dialog click &amp;quot;Reload Addons&amp;quot;, and if all went well, your addon will appear.&lt;br /&gt;
&lt;br /&gt;
Click the check box next to the Hello World addon to enable it, then close the Addon Settings Dialog.&lt;br /&gt;
&lt;br /&gt;
In the Addon menu the Hello World addon should be visible. Clicking on it will run the addon.&lt;br /&gt;
&lt;br /&gt;
Now In the window&lt;br /&gt;
&lt;br /&gt;
=Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;addonInfo&amp;gt;&lt;br /&gt;
      &amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
      &amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
   &amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T20:55:47Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The Lightforge API allows you to create new tools, new input and output methods, automate complex operations, and much more.&lt;br /&gt;
&lt;br /&gt;
Lightforge addons are written in IronPython. IronPython is an open-source implementation of the Python programming language which is tightly integrated with the .NET Framework. It allows you to use both .Net and Python libraries and allows very tight integration between Lightforge and addons. For more information on IronPython you can visit [http://www.ironpython.net www.ironpython.net]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;addonInfo&amp;gt;&lt;br /&gt;
      &amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
      &amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
   &amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=API</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=API"/>
				<updated>2013-05-09T20:35:05Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Types=&lt;br /&gt;
&lt;br /&gt;
==api.attributeTypes==&lt;br /&gt;
[[api.attributeTypes]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
&lt;br /&gt;
==api.cues==&lt;br /&gt;
Used for working with cues.&lt;br /&gt;
&lt;br /&gt;
[[api.cues]]&lt;br /&gt;
&lt;br /&gt;
==api.groups==&lt;br /&gt;
Used for working with groups.&lt;br /&gt;
&lt;br /&gt;
[[api.groups]]&lt;br /&gt;
&lt;br /&gt;
==api.output==&lt;br /&gt;
Used for getting information about DMX output.&lt;br /&gt;
&lt;br /&gt;
[[api.output]]&lt;br /&gt;
&lt;br /&gt;
=Functions=&lt;br /&gt;
&lt;br /&gt;
==getTime==&lt;br /&gt;
'''getTime() As Double'''&lt;br /&gt;
&lt;br /&gt;
Gets the current playback position.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   print(api.getTime())&lt;br /&gt;
&lt;br /&gt;
==setTime==&lt;br /&gt;
'''setTime(time As Double)'''&lt;br /&gt;
&lt;br /&gt;
Sets the current playback position to the specified time.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   api.setTime(36.5)&lt;br /&gt;
   print(api.getTime())&lt;br /&gt;
&lt;br /&gt;
==wait==&lt;br /&gt;
'''wait(seconds As Double)'''&lt;br /&gt;
&lt;br /&gt;
Causes execution to wait for the specified number of seconds.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   api.wait(3.5)&lt;br /&gt;
&lt;br /&gt;
=Events=&lt;br /&gt;
&lt;br /&gt;
==onInitialize==&lt;br /&gt;
Called when the script is loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onInitialize():&lt;br /&gt;
      print(&amp;quot;Script Loaded&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onEdit==&lt;br /&gt;
Called when the script settings are being edited. Editing a script's settings from the Script Settings Dialog is only possible if this function is implemented in your code.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onEdit():&lt;br /&gt;
      print(&amp;quot;Settings Edit&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onExecute==&lt;br /&gt;
Called when this script is specifically executed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onExecute():&lt;br /&gt;
      print(&amp;quot;Script Executed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onExecuteAsync==&lt;br /&gt;
Called when this script is specifically executed. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onExecuteAsync():&lt;br /&gt;
      print(&amp;quot;Script Executed Asynchronously&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onStartup==&lt;br /&gt;
Called when Lightforge starts up.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onStartup():&lt;br /&gt;
      print(&amp;quot;Lightforge Started&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onStartupAsync==&lt;br /&gt;
Called when Lightforge starts up. Code run from this function is executed asynchronously.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onStartupAsync():&lt;br /&gt;
      print(&amp;quot;Lightforge Started (Async)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStart==&lt;br /&gt;
Called when timeline playback has started.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onPlaybackStart():&lt;br /&gt;
      print(&amp;quot;Playback Started&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onPlaybackStop==&lt;br /&gt;
Called when timeline playback has stopped&lt;br /&gt;
&lt;br /&gt;
Usage:   &lt;br /&gt;
   def onPlaybackStop():&lt;br /&gt;
      print(&amp;quot;Playback Stopped&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onFrameChange==&lt;br /&gt;
Called on every frame change during playback, scrubbing, and time changes.&lt;br /&gt;
&lt;br /&gt;
Usage:	&lt;br /&gt;
   def onFrameChange(seconds As Double):&lt;br /&gt;
      print(&amp;quot;Frame Changed &amp;quot; + seconds)&lt;br /&gt;
&lt;br /&gt;
==onShutdown==&lt;br /&gt;
Called when Lightforge is shutting down.&lt;br /&gt;
&lt;br /&gt;
Usage:	&lt;br /&gt;
   def onShutdown():&lt;br /&gt;
      print(&amp;quot;Lightforge Shutdown&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onCuelistChanged==&lt;br /&gt;
Called when the current cuelist has been changed.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onCuelistChanged():&lt;br /&gt;
      print(&amp;quot;Cue List Changed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==onShowLoaded==&lt;br /&gt;
Called when a new show has been loaded.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   def onShowLoaded():&lt;br /&gt;
      print(&amp;quot;Show Loaded&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addon</id>
		<title>Addon</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addon"/>
				<updated>2013-05-09T20:34:17Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: Created page with &amp;quot;=Methods=  ==getDirectory()== '''getDirectory() As String'''  This function returns the path of the current addon's folder.  Usage:    path = addon.getDirectory()    print(path)&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Methods=&lt;br /&gt;
&lt;br /&gt;
==getDirectory()==&lt;br /&gt;
'''getDirectory() As String'''&lt;br /&gt;
&lt;br /&gt;
This function returns the path of the current addon's folder.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
   path = addon.getDirectory()&lt;br /&gt;
   print(path)&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	<entry>
		<id>http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons</id>
		<title>Addons</title>
		<link rel="alternate" type="text/html" href="http://www.visualsorcery.com/LightForgeWiki/index.php?title=Addons"/>
				<updated>2013-05-09T20:31:27Z</updated>
		
		<summary type="html">&lt;p&gt;Chris Monson: /* XML Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Structure=&lt;br /&gt;
The file structure of a Lightforge addon is very simple. It consists of a folder with at least one required script file named base.py, and optionally a xml file named addonInfo.xml.&lt;br /&gt;
&lt;br /&gt;
==base.py==&lt;br /&gt;
This is the entry point for your addon. It's the script file that Lightforge interacts with directly.&lt;br /&gt;
&lt;br /&gt;
==addonInfo.xml==&lt;br /&gt;
This xml file gives Lightforge additional information about your addon. This info will appear in the Addon Settings panel.&lt;br /&gt;
&lt;br /&gt;
The addonInfo.xml file can contain the following information:&lt;br /&gt;
&lt;br /&gt;
===Author===&lt;br /&gt;
The author of the addon.&lt;br /&gt;
===Version===&lt;br /&gt;
The current version number.&lt;br /&gt;
===Website===&lt;br /&gt;
A website associated with this addon.&lt;br /&gt;
===Support===&lt;br /&gt;
An email address or website for providing addon support.&lt;br /&gt;
&lt;br /&gt;
===XML Structure===&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;addonInfo&amp;gt;&lt;br /&gt;
      &amp;lt;author&amp;gt;Visual Sorcery&amp;lt;/author&amp;gt;&lt;br /&gt;
      &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;&lt;br /&gt;
      &amp;lt;website&amp;gt;http://www.visualsorcery.com/&amp;lt;/website&amp;gt;&lt;br /&gt;
      &amp;lt;support&amp;gt;support@visualsorcery.com&amp;lt;/support&amp;gt;&lt;br /&gt;
   &amp;lt;/addonInfo&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Classes=&lt;br /&gt;
==API==&lt;br /&gt;
This class contains all access for working with Lightforge.&lt;br /&gt;
[[API]]&lt;br /&gt;
==Addon==&lt;br /&gt;
This class gives you access to information about your addon.&lt;br /&gt;
[[Addon]]&lt;/div&gt;</summary>
		<author><name>Chris Monson</name></author>	</entry>

	</feed>