def SetupUserData():
    #1.1: UI Header
    if not ud.UserDataExists(op, "File Handling"):
        ud.CreateUserData(op, "File Handling", c4d.DTYPE_SEPARATOR)

    #1.2: "Filename" text box
    if not ud.UserDataExists(op, "Transformation Matrices File"):
        ud.CreateUserData(op, "Transformation Matrices File",
                          c4d.DTYPE_FILENAME)

    #1.3
    if not ud.UserDataExists(op, "Data Has Headers"):
        ud.CreateUserData(op, "Data Has Headers", c4d.DTYPE_BOOL)

    #2.1: UI Header
    if not ud.UserDataExists(op, "Display"):
        ud.CreateUserData(op, "Display", c4d.DTYPE_SEPARATOR)

    #2.2: "Object Type" text box
    if not ud.UserDataExists(op, "Display Matrices As"):
        ud.CreateDropDown(op, "Display Matrices As", c4d.CUSTOMGUI_CYCLE,
                          ["Quad", "Triangle"])

    #2.3: "Display Size" slider
    if not ud.UserDataExists(op, "Display Size"):
        ud.CreateFloatData(op, "Display Size", "Float Slider", 0, 100, 0.01,
                           "Meters")

    #3.1: UI Header
    if not ud.UserDataExists(op, "Pipeline"):
        ud.CreateUserData(op, "Pipeline", c4d.DTYPE_SEPARATOR)

    #3.2: "Filename" text box
    if not ud.UserDataExists(op, "Attach to Cloner"):
        ud.CreateUserData(op, "Attach to Cloner", c4d.DTYPE_BASELISTLINK)
def SetupUserData():
    """
    Setup the UI of the Python Generator object
    """
    # ------------------------------------------------------------------------------------------------------------------
    # 1 - FILE HANDLING UI ---------------------------------------------------------------------------------------------
    # ------------------------------------------------------------------------------------------------------------------

    # 1.1: UI Header
    if not ud.UserDataExists(op, "File Handling"):
        ud.CreateUserData(op, "File Handling", c4d.DTYPE_SEPARATOR)
    # 1.2: "Filename" text box
    if not ud.UserDataExists(op, "First Object FileName"):
        ud.CreateUserData(op, "First Object FileName", c4d.DTYPE_FILENAME,
                          True)
    # 1.3: "Load All" Boolean, determines whether to load all files in the folder at once
    if not ud.UserDataExists(op, "Load All"):
        ud.CreateUserData(op, "Load All", c4d.DTYPE_BOOL)
    # 1.4
    if not ud.UserDataExists(op, "First Frame"):
        ud.CreateIntegerData(op, "First Frame", "Integer")
    # 1.5
    if not ud.UserDataExists(op, "Last Frame"):
        ud.CreateIntegerData(op, "Last Frame", "Integer")
    # 1.6
    if not ud.UserDataExists(op, "Frame Step"):
        ud.CreateIntegerData(op, "Frame Step", "Integer Slider")
        ud.SetUserDataValue(op, "Frame Step", 1)
    # 1.7
    if not ud.UserDataExists(op, "Frame Offset"):
        ud.CreateIntegerData(op, "Frame Offset", "Integer Slider")
        ud.SetUserDataValue(op, "Frame Offset", 0)
    # 1.8
    if not ud.UserDataExists(op, "After Last Frame"):
        ud.CreateDropDown(op, "After Last Frame", "Cycle",
                          ["Freeze", "Loop", "Ping Pong", "Disappear"])
        ud.SetUserDataValue(op, "After Last Frame", 0)
    # 1.9
    if not ud.UserDataExists(op, "File Handling Message"):
        ud.CreateUserData(op, "File Handling Message", c4d.DTYPE_STATICTEXT,
                          True)

    # ------------------------------------------------------------------------------------------------------------------
    # 2 - MESH HANDLING UI ---------------------------------------------------------------------------------------------
    # ------------------------------------------------------------------------------------------------------------------

    # 2.1
    if not ud.UserDataExists(op, "Mesh Handling"):
        ud.CreateUserData(op, "Mesh Handling", c4d.DTYPE_SEPARATOR)
    # 2.2
    if not ud.UserDataExists(op, "Phong Smoothing"):
        ud.CreateUserData(op, "Phong Smoothing", c4d.DTYPE_BOOL)
    # 2.3
    if not ud.UserDataExists(op, "Import Vertex Colors"):
        ud.CreateUserData(op, "Import Vertex Colors", c4d.DTYPE_BOOL)
    # 2.4
    if not ud.UserDataExists(op, "Create Test Material"):
        ud.CreateUserData(op, "Create Test Material", c4d.DTYPE_BOOL)
    # 2.5
    if not ud.UserDataExists(op, "Mesh Handling Message"):
        ud.CreateUserData(op, "Mesh Handling Message", c4d.DTYPE_STATICTEXT,
                          True)
    # 2.6
    if not ud.UserDataExists(op, "Vertices"):
        ud.CreateUserData(op, "Vertices", c4d.DTYPE_STATICTEXT, True)
    # 2.7
    if not ud.UserDataExists(op, "Colors"):
        ud.CreateUserData(op, "Colors", c4d.DTYPE_STATICTEXT, True)
    # 2.8
    if not ud.UserDataExists(op, "Faces"):
        ud.CreateUserData(op, "Faces", c4d.DTYPE_STATICTEXT, True)

    # ------------------------------------------------------------------------------------------------------------------
    # 3 - COORDINATE HANDLING UI ---------------------------------------------------------------------------------------
    # ------------------------------------------------------------------------------------------------------------------
    # 3.1
    if not ud.UserDataExists(op, "Coordinate Handling"):
        ud.CreateUserData(op, "Coordinate Handling", c4d.DTYPE_SEPARATOR)
    # 3.2
    if not ud.UserDataExists(op, "Swap Y/Z"):
        ud.CreateUserData(op, "Swap Y/Z", c4d.DTYPE_BOOL)
    # 3.3
    if not ud.UserDataExists(op, "Flip Z"):
        ud.CreateUserData(op, "Flip Z", c4d.DTYPE_BOOL)
    # 3.4
    if not ud.UserDataExists(op, "Scale"):
        ud.CreateFloatData(op, "Scale", "Float Slider", 0.0, 1000.0, 0.1)
        ud.SetUserDataValue(op, "Scale", 1)
def SetupUserData():
    #1
    if not ud.UserDataExists(op.GetObject(), "File Handling"):
        ud.CreateUserData(op.GetObject(), "File Handling", c4d.DTYPE_SEPARATOR,
                          True)
    #2
    if not ud.UserDataExists(op.GetObject(), "First Object FileName"):
        ud.CreateUserData(op.GetObject(), "First Object FileName",
                          c4d.DTYPE_FILENAME, True)
    #3
    if not ud.UserDataExists(op.GetObject(), "First Frame"):
        ud.CreateIntegerData(op.GetObject(), "First Frame", "Integer", 0, 100,
                             1)
    #4
    if not ud.UserDataExists(op.GetObject(), "Last Frame"):
        ud.CreateIntegerData(op.GetObject(), "Last Frame", "Integer", 0, 100,
                             1)
    #5
    if not ud.UserDataExists(op.GetObject(), "Frame Step"):
        ud.CreateIntegerData(op.GetObject(), "Frame Step", "Integer Slider", 1,
                             100, 1)
        ud.SetUserData(op.GetObject(), "Frame Step", 1)
    #6
    if not ud.UserDataExists(op.GetObject(), "File Handling Message"):
        ud.CreateUserData(op.GetObject(), "File Handling Message",
                          c4d.DTYPE_STATICTEXT, True)
    #7
    if not ud.UserDataExists(op.GetObject(), "Mesh Handling"):
        ud.CreateUserData(op.GetObject(), "Mesh Handling", c4d.DTYPE_SEPARATOR,
                          True)
    #8
    if not ud.UserDataExists(op.GetObject(), "Swap Y/Z"):
        ud.CreateUserData(op.GetObject(), "Swap Y/Z", c4d.DTYPE_BOOL, True)
    #9
    if not ud.UserDataExists(op.GetObject(), "Phong Smoothing"):
        ud.CreateUserData(op.GetObject(), "Phong Smoothing", c4d.DTYPE_BOOL,
                          True)
    #10
    if not ud.UserDataExists(op.GetObject(), "Import Vertex Colors"):
        ud.CreateUserData(op.GetObject(), "Import Vertex Colors",
                          c4d.DTYPE_BOOL, True)
    #11
    if not ud.UserDataExists(op.GetObject(), "Create Test Material"):
        ud.CreateUserData(op.GetObject(), "Create Test Material",
                          c4d.DTYPE_BOOL, True)
    #12
    if not ud.UserDataExists(op.GetObject(), "Mesh Handling Message"):
        ud.CreateUserData(op.GetObject(), "Mesh Handling Message",
                          c4d.DTYPE_STATICTEXT, True)