# lsystem.py
# One of 7 python scripts that implement a simple L system. 
# Useage from a terminal:
#    $ python PATH_TO_PYTHON_DIR/lsystem.py "PATH_TO_SCRIPT_DIR/script.dat"
# The information in the script.dat file determines what type of graphics
# are generated by the L system. The other python scripts are,
# lscriptreader.py - reads a script.dat file and produces a database.
# lgenerator.py - uses the database to generate a long L string.
# lmel.py - uses the L string to generate a .mel script for Maya.
# lrib - uses the L string to generate a .rib file for RenderMan.
# mayaport.py - uses a socket to tell Maya to source a .mel script.
# A mel script, LMelProcs.mel, is also part of the L system. See lmel.py
# for more information.
# Malcolm Kesson
# 18 Jan 2012, 26 Jan 2012
import lscriptreader
import lgenerator
import lmel, mayasocket
import lrib
import os, sys
def main():
    args = sys.argv[1:]
    script_path = args[0]    # full path to the dat file
def run(script_path):
    # Read the data from the L script file and 
    # transfer it to the database (dictionary).
    text = lscriptreader.read(script_path)
    database = lscriptreader.parse(text, lscriptreader.defaults)
    # Extract some basic information that will control
    # how the L string is generated and interpreted.
    port = database['port']
    display = database['display'].lower()
    title = database['title']
    # Generate the L string.
    lstr = lgenerator.write_lstring(database)
    # Prepare the path to the output file. The appropriate
    # file extension will be added later.
    directory = os.path.dirname(script_path)    
    outpath = os.path.join(directory, title)
    if display == 'mel':
        outpath += '.mel'
        print outpath
        lmel.render(lstr, outpath, database)
        if port > 1024:
            mayasocket.source(outpath, port)
    elif display == 'rib':
        outpath += '.rib'
        print outpath
        lrib.render(lstr, outpath, database)
if __name__ == "__main__":
    # Running this script directly in Cutter will the L system to process
    # the following data file - handy for purposes of testing the modules.