import c4d
import os, sys, time

#------------- 
# Specify these parameters
ARNOLD_OPERATORS_OBJECT_NAME = "Arnold Operators"
OUTPUT_PATH = "/path/to/myops.ass"
#-------------

# from c4dtoa_symols.h
ARNOLD_OPERATOR = 1040497
ARNOLD_OPERATOR_EXPORT_COMMAND = 1041536
ARNOLD_OPERATOR_IMPORT_COMMAND = 1041537

C4DAI_OPEXP_PATH = 0
C4DAI_OPEXP_OBJECT = 1
C4DAI_OPEXP_RESULT = 1000

C4DAI_OPIMP_PATH = 0
C4DAI_OPIMP_OBJECT = 1
C4DAI_OPIMP_RESULT = 1000

def exportOperators(op, path):
    # setup the settings
    settings = c4d.BaseContainer()
    settings.SetFilename(C4DAI_OPEXP_PATH, path)
    settings.SetLink(C4DAI_OPEXP_OBJECT, op)
    doc.GetSettingsInstance(c4d.DOCUMENTSETTINGS_DOCUMENT).SetContainer(ARNOLD_OPERATOR_EXPORT_COMMAND, settings)

    # execute export
    print "Export operators to %s" % settings.GetFilename(C4DAI_OPEXP_PATH)
    c4d.CallCommand(ARNOLD_OPERATOR_EXPORT_COMMAND)

    # check the result
    resultData = doc.GetSettingsInstance(c4d.DOCUMENTSETTINGS_DOCUMENT).GetContainer(ARNOLD_OPERATOR_EXPORT_COMMAND)
    res = resultData.GetInt32(C4DAI_OPEXP_RESULT)
    if res != 0:
        raise Exception("[ERROR] Operator export failed: %d" % res)

    print "Operator export done"

def importOperators(path):
    # create an Arnold Operators object where the operators will be imported
    op = c4d.BaseObject(ARNOLD_OPERATOR)
    doc.InsertObject(op)
    
    # setup the settings
    settings = c4d.BaseContainer()
    settings.SetFilename(C4DAI_OPIMP_PATH, path)
    settings.SetLink(C4DAI_OPIMP_OBJECT, op)
    doc.GetSettingsInstance(c4d.DOCUMENTSETTINGS_DOCUMENT).SetContainer(ARNOLD_OPERATOR_IMPORT_COMMAND, settings)

    # execute import
    print "Import operators from %s" % settings.GetFilename(C4DAI_OPIMP_PATH)
    c4d.CallCommand(ARNOLD_OPERATOR_IMPORT_COMMAND)

    # check the result
    resultData = doc.GetSettingsInstance(c4d.DOCUMENTSETTINGS_DOCUMENT).GetContainer(ARNOLD_OPERATOR_EXPORT_COMMAND)
    res = resultData.GetInt32(C4DAI_OPEXP_RESULT)
    if res != 0:
        raise Exception("[ERROR] Operator import failed: %d" % res)

    op.SetName("%s import" % ARNOLD_OPERATORS_OBJECT_NAME)
    c4d.EventAdd()
    
    print "Operator import done"
    
def main():
    # find the operator object we want to export
    op = doc.SearchObject(ARNOLD_OPERATORS_OBJECT_NAME)
    if op is None:
        raise Exception("Arnold Operators object is not found: %s" % ARNOLD_OPERATORS_OBJECT_NAME)
    
    # export
    exportOperators(op, OUTPUT_PATH)
    
    # import
    importOperators(OUTPUT_PATH)

if __name__=='__main__':
    main()