# This Module is an Attempt to Visualize Symmetrical Components in Electrical Power Systems
# Prompts the User for the Fault Type: 3LG, 1LG, LL, 2LG
# Continuously runs random examples of fault type selected
# Created with Python 3.6 and Vpython 7.4.5 aka Glowscript
# use this module any way you like
# just credit www.3phaseee.com
# =================================================================================================

from vpython import *

# -- VP COLORS ----------------------------------------------------------------
backgroundcolor = color.black       # black
poscolor = vector(0.4, 1.0, 0.4)    # positive sequence color green
negcolor = vector(0.4, 0.4, 1.0)    # negative sequence color blue
zerocolor = color.red               # zero sequence color red
acolor = color.orange               # a phase color orange
bcolor = color.yellow               # b phase color yellow
ccolor = color.cyan                 # c phase color cyan

vacolor = vector(0.4, 1.0, 0.4)             # Green
vbcolor = vector(0.1176, 0.5647, 1.0)       # Blue
vccolor = color.magenta
vposcolor = color.orange
vnegcolor = vector(1.0, 1.0, 0.2)           # Soft Yellow

vabcolor = vector(0.5391, 0.1680, 0.8828)   # Blue-Violet
vbccolor = vector(1.0, 0.8398, 0.0)         # Blue-Violet
vcacolor = vector(0.8203, 0.4102, 0.1172)   # Blue-Violet

labelcolor = color.white                    # label color white
axiscolor = color.gray(0.5)                 # axis color gray
r_labelcolor = color.gray(0.8)              # resultant phasor label color
bodycolor = vector(0.9414, 0.9453, 0.9608)  # default body background

# -- GLOBALS ------------------------------------------------------------------
scenewidth = sceneheight = 584
shiftplus = vector(-0.5, 0.866025, 0)           # 120 degree phase shift
shiftminus = vector(-0.5, -0.866025, 0)         # -120 degree phase shift

speed = 100                                     # rotation speed
da = 1                                          # rotation angle change (degrees)
rad_da = radians(da)                            # rotation angle change (radians)
label_angle = radians(12.0)                     # angle leading for A+B+C
scenelist = []                                  # global scenelist that changes
next_type = 1                                   # default fault type 1=3LG, 2=1LG, 3=2LG, 4=LL


# =================================================================================================
# === FUNCTIONS  ==================================================================================
# =================================================================================================
def get_example():
    zkv_list = [
        [69, 0.288349, 2.23305, 0.324529, 2.20732, 0.218898, 1.90939],
        [138, 0.193351, 2.42172, 0.220924, 2.42397, 0.380481, 2.54792],
        [69, 0.252203, 2.51006, 0.254699, 2.51731, 0.917941, 4.2644],
        [138, 0.293967, 2.65715, 0.307975, 2.70837, 0.909715, 3.84876],
        [138, 0.241344, 2.74361, 0.254073, 2.78897, 0.990305, 4.52052],
        [138, 0.251738, 3.00523, 0.304976, 2.99436, 0.532998, 3.75149],
        [69, 0.71799, 3.26345, 0.720938, 3.26654, 2.98494, 10.4278],
        [138, 0.362818, 3.59962, 0.38344, 3.6056, 0.491956, 3.89833],
        [138, 0.442747, 3.72752, 0.453286, 3.75507, 1.33236, 6.03425],
        [69, 0.601159, 4.01186, 0.589801, 3.95724, 1.36166, 5.9764],
        [138, 0.322327, 4.18483, 0.402843, 4.16365, 1.342, 6.87449],
        [138, 0.486219, 4.44596, 0.554298, 4.42743, 1.92696, 7.9897],
        [69, 1.36879, 4.67133, 1.35739, 4.61683, 2.5468, 7.38971],
        [138, 0.606455, 4.90948, 0.655338, 4.8925, 2.15121, 9.83527],
        [138, 0.466988, 5.34003, 0.541782, 5.31966, 2.28507, 10.3373],
        [138, 0.54046, 5.75608, 0.614618, 5.73703, 2.71393, 11.8744],
        [138, 1.017, 6.13335, 1.05557, 6.07282, 0.913673, 6.62596],
        [69, 2.93332, 6.41524, 2.93502, 6.41443, 5.91975, 15.3207],
        [138, 1.04015, 7.07721, 1.08829, 7.06895, 3.80161, 14.9652],
        [138, 1.08478, 7.57898, 1.09386, 7.57175, 3.63246, 13.4669],
        [69, 2.14354, 8.45345, 2.14775, 8.45315, 4.60199, 20.6853],
        [138, 0.958808, 9.29343, 0.968406, 9.29197, 0.380402, 7.40152],
        [69, 1.94712, 9.62851, 1.9495, 9.61791, 1.91581, 10.3141],
        [138, 1.28293, 10.1917, 1.20942, 7.66411, 1.29663, 6.51494],
        [138, 3.66591, 10.6622, 3.64278, 10.4996, 6.02987, 18.2467],
        [138, 1.52271, 11.0643, 1.55045, 11.0584, 2.64032, 12.8696],
        [138, 2.04988, 11.4281, 2.07307, 11.3967, 5.09383, 21.2025],
        [138, 2.31899, 12.0667, 2.3705, 12.0535, 7.74135, 24.2571],
        [138, 1.99474, 12.5666, 2.02599, 12.5592, 6.1745, 21.9262],
        [138, 2.02244, 13.4447, 1.96267, 11.5095, 4.94571, 22.2884],
        [69, 7.35539, 14.0294, 7.35666, 14.0196, 10.6014, 33.2628],
        [138, 2.8727, 14.9267, 2.90399, 14.9192, 12.0306, 24.3606],
        [138, 2.49902, 15.8217, 2.43884, 14.0058, 7.69709, 29.8661],
        [138, 3.30891, 16.408, 3.31132, 16.3891, 6.4889, 29.0021],
        [138, 2.54422, 17.1923, 2.58515, 16.9956, 4.16046, 25.1381],
        [138, 3.51239, 18.8003, 3.55504, 18.6085, 3.93826, 25.5761],
        [69, 9.05311, 20.7156, 9.05367, 20.7143, 16.0649, 38.8412],
        [138, 4.09485, 22.6698, 4.09806, 22.6427, 8.04446, 42.8638],
        [138, 5.86871, 27.034, 5.87379, 27.0063, 11.7474, 46.8322],
        [138, 6.85103, 28.9512, 6.85219, 28.8674, 8.80562, 38.4738]]
    i = int(random() * len(zkv_list))
    phasekv = vector(1000 * zkv_list[i][0] / sqrt(3), 0, 0)
    z_positive = vector(zkv_list[i][1], zkv_list[i][2], 0)
    z_negative = vector(zkv_list[i][3], zkv_list[i][4], 0)
    z_zero = vector(zkv_list[i][5], zkv_list[i][6], 0)
    return phasekv, z_positive, z_negative, z_zero


def get_header(title, phase_kv, z_positive, z_negative, z_zero, ibase):
    global r1
    global r2
    global r3
    global r4
    global r5
    global next_type
    title += '<a href="http://3phaseee.com/vpython_home"> 3phaseee.com</a>'
    header = canvas(caption=title, width=3 / 2 * scenewidth,  height=sceneheight / 14, center=vector(0, 0, 0), background=backgroundcolor)
    header.resizable = False
    header.userzoom = False
    header.userspin = False
    header.userpan = False
    text1 = 'VLL = {0:-5.1f} kV    '.format(phase_kv.mag * sqrt(3) / 1000)
    text2 = 'V\u03d5  = {0:-5.1f} kV     '.format(phase_kv.mag / 1000)
    text3 = 'Z+ = {0:7.4f} + j{1:-7.4f} \u2126      '.format(z_positive.x, z_positive.y)
    text4 = ''
    text5 = ''
    text6 = 'Ibase = I+ = {0:7.1f} A'.format(ibase)
    if z_negative.mag > 0.0:
        text4 = 'Z- = {0:7.4f} + j{1:-7.4f} \u2126      '.format(z_negative.x, z_negative.y)
    if z_zero.mag > 0.0:
        text5 = 'Zo = {0:7.4f} + j{1:-7.4f} \u2126      '.format(z_zero.x, z_zero.y)
    scenetext = text1 + text2 + text3 + text4 + text5 + text6
    label(pos=vector(0, 0, 0), text=scenetext, box=0, color=r_labelcolor, opacity=0.0, height=13, align='center')
    header.append_to_title('<b>Fault Type:</b>  ')
    r1 = radio(pos=header.title_anchor, id=1, bind=radio_control, text='<b>3LG  </b>', checked=next_type == 1)
    r2 = radio(pos=header.title_anchor, id=2, bind=radio_control, text='<b>1LG  </b>', checked=next_type == 2)
    r3 = radio(pos=header.title_anchor, id=3, bind=radio_control, text='<b>2LG  </b>', checked=next_type == 3)
    r4 = radio(pos=header.title_anchor, id=4, bind=radio_control, text='<b>LL  </b>', checked=next_type == 4)
    r5 = radio(pos=header.title_anchor, id=0, bind=radio_control, text='<b>Exit     </b>', checked=next_type == 0)
    header.append_to_title('<-- <i>Toggle for random examples</i>')
    return header


def radio_control(r):
    global next_type
    r.checked = True
    if r.id == 1:
        next_type = 1
        r2.checked = False
        r3.checked = False
        r4.checked = False
        r5.checked = False
    elif r.id == 2:
        next_type = 2
        r1.checked = False
        r3.checked = False
        r4.checked = False
        r5.checked = False
    elif r.id == 3:
        next_type = 3
        r1.checked = False
        r2.checked = False
        r4.checked = False
        r5.checked = False
    elif r.id == 4:
        next_type = 4
        r1.checked = False
        r2.checked = False
        r3.checked = False
        r5.checked = False
    elif r.id == 0:
        next_type = 0
        r1.checked = False
        r2.checked = False
        r3.checked = False
        r4.checked = False
    return


def get_scene123():
    scene123 = canvas(width=scenewidth / 2, height=sceneheight / 2, center=vector(0, 0, 0), foreground=axiscolor, background=backgroundcolor, align='left')
    scene123.resizable = False
    scene123.autoscale = True
    scene123.userzoom = False
    scene123.userspin = False
    scene123.userpan = False
    border = 1.3
    curve(pos=[vector(-border, -border, 0), vector(border, -border, 0), vector(border, border, 0), vector(-border, border, 0), vector(-border, -border, 0)], radius=0.007)  # border
    curve(pos=[vector(-1.1, 0, 0), vector(1.1, 0, 0)], radius=0.003)                                        # real axis
    label(pos=vector(1.2, 0, 0), text='i', box=0, opacity=0, color=labelcolor)                              # scale labels (pu)
    label(pos=vector(1, -.17, 0), text='1', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(1, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(.5, 0, 0), text='|', box=0, opacity=0, color=labelcolor,  height=10)
    label(pos=vector(-.5, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(-1, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    curve(pos=[vector(0, 1.1, 0), vector(0, -1.1, 0)], radius=0.007, color=axiscolor)                       # imaginary axis
    label(pos=vector(0, 1.2, 0), text='ji', box=0, opacity=0, color=labelcolor)                             # scale labels (pu)
    label(pos=vector(0, 1, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, 0.5, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, -.5, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, -1, 0), text='--', box=0, opacity=0, color=labelcolor)
    return scene123


def get_scene123_x2():
    scene123 = canvas(width=scenewidth / 2, height=sceneheight / 2, center=vector(0, 0, 0), foreground=axiscolor, background=backgroundcolor, align='left')
    scene123.resizable = False
    scene123.autoscale = True
    scene123.userzoom = False
    scene123.userspin = False
    scene123.userpan = False
    border = 0.65
    curve(pos=[vector(-border, -border, 0), vector(border, -border, 0), vector(border, border, 0), vector(-border, border, 0), vector(-border, -border, 0)], radius=0.0035)  # border
    curve(pos=[vector(-0.55, 0, 0), vector(0.55, 0, 0)], radius=0.0015)                                     # real axis
    label(pos=vector(0.6, 0, 0), text='i', box=0, opacity=0, color=labelcolor)                              # scale labels (pu)
    label(pos=vector(0.5, -.085, 0), text='0.5', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0.5, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0.25, 0, 0), text='|', box=0, opacity=0, color=labelcolor,  height=10)
    label(pos=vector(-0.25, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(-0.5, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    curve(pos=[vector(0, 0.55, 0), vector(0, -0.55, 0)], radius=0.0035, color=axiscolor)                    # imaginary axis
    label(pos=vector(0, 0.6, 0), text='ji', box=0, opacity=0, color=labelcolor)                             # scale labels (pu)
    label(pos=vector(0, 0.5, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, 0.25, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, -.25, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, -0.5, 0), text='--', box=0, opacity=0, color=labelcolor)
    return scene123


def get_scene45():
    scene45 = canvas(width=3 / 4 * scenewidth, height=3 / 4 * sceneheight, center=vector(0, 0, 0), foreground=axiscolor, background=backgroundcolor, align='left')
    scene45.resizable = False
    scene45.autoscale = True
    scene45.userzoom = False
    scene45.userspin = False
    scene45.userpan = False
    border = 1.3
    curve(pos=[vector(-border, -border, 0), vector(border, -border, 0), vector(border, border, 0), vector(-border, border, 0), vector(-border, -border, 0)], radius=0.004)  # border
    curve(pos=[vector(-1.1, 0, 0), vector(1.1, 0, 0)], radius=0.004)                                        # real axis
    label(pos=vector(1.2, 0, 0), text='i', box=0, opacity=0, color=labelcolor)                              # scale labels (pu)
    label(pos=vector(1, -0.12, 0), text='1', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(1, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(.5, 0, 0), text='|', box=0, opacity=0, color=labelcolor,  height=10)
    label(pos=vector(-.5, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(-1, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    curve(pos=[vector(0, 1.1, 0), vector(0, -1.1, 0)], radius=0.007, color=axiscolor)                       # imaginary axis
    label(pos=vector(0, 1.2, 0), text='ji', box=0, opacity=0, color=labelcolor)                             # scale labels (pu)
    label(pos=vector(0, 1, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, 0.5, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, -.5, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, -1, 0), text='--', box=0, opacity=0, color=labelcolor)
    return scene45


def get_scene45_x3():
    scene45 = canvas(width=3 / 4 * scenewidth, height=3 / 4 * sceneheight, center=vector(0, 0, 0), foreground=axiscolor, background=backgroundcolor, align='left')
    scene45.resizable = False
    scene45.autoscale = True
    scene45.userzoom = False
    scene45.userspin = False
    scene45.userpan = False
    border = 3.9
    curve(pos=[vector(-border, -border, 0), vector(border, -border, 0), vector(border, border, 0), vector(-border, border, 0), vector(-border, -border, 0)], radius=0.012)  # border
    curve(pos=[vector(-3.3, 0, 0), vector(3.3, 0, 0)], radius=0.012)                                        # real axis
    label(pos=vector(3.6, 0, 0), text='i', box=0, opacity=0, color=labelcolor)                              # scale labels (pu)
    label(pos=vector(3, -0.36, 0), text='3', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(3, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=9)
    label(pos=vector(2, 0, 0), text='|', box=0, opacity=0, color=labelcolor,  height=9)
    label(pos=vector(1, 0, 0), text='|', box=0, opacity=0, color=labelcolor,  height=9)
    label(pos=vector(-1, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=9)
    label(pos=vector(-2, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=9)
    label(pos=vector(-3, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=9)
    curve(pos=[vector(0, 3.3, 0), vector(0, -3.3, 0)], radius=0.020, color=axiscolor)                       # imaginary axis
    label(pos=vector(0, 3.6, 0), text='ji', box=0, opacity=0, color=labelcolor)                             # scale labels (pu)
    label(pos=vector(0, 3, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0, 2, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0, 1, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0, -1, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0, -2, 0), text='--', box=0, opacity=0, color=labelcolor, height=10) 
    label(pos=vector(0, -3, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    return scene45


def get_scene45_x2():
    scene45 = canvas(width=3 / 4 * scenewidth, height=3 / 4 * sceneheight, center=vector(0, 0, 0), foreground=axiscolor, background=backgroundcolor, align='left')
    scene45.resizable = False
    scene45.autoscale = True
    scene45.userzoom = False
    scene45.userspin = False
    scene45.userpan = False
    border = 2.6
    curve(pos=[vector(-border, -border, 0), vector(border, -border, 0), vector(border, border, 0), vector(-border, border, 0), vector(-border, -border, 0)], radius=0.008)  # border
    curve(pos=[vector(-2.2, 0, 0), vector(2.2, 0, 0)], radius=0.008)                                        # real axis
    label(pos=vector(2.4, 0, 0), text='i', box=0, opacity=0, color=labelcolor)                              # scale labels (pu)
    label(pos=vector(2, -0.24, 0), text='2', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(2, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=9)
    label(pos=vector(1, 0, 0), text='|', box=0, opacity=0, color=labelcolor,  height=9)
    label(pos=vector(-1, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=9)
    label(pos=vector(-2, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=9)
    curve(pos=[vector(0, 2.2, 0), vector(0, -2.2, 0)], radius=0.014, color=axiscolor)                       # imaginary axis
    label(pos=vector(0, 2.4, 0), text='ji', box=0, opacity=0, color=labelcolor)                             # scale labels (pu)
    label(pos=vector(0, 2, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0, 1, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0, -1, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(0, -2, 0), text='--', box=0, opacity=0, color=labelcolor, height=10)
    return scene45


def get_scene5_v():
    scene45 = canvas(width=3 / 4 * scenewidth, height=3 / 4 * sceneheight, center=vector(0, 0, 0), foreground=axiscolor, background=backgroundcolor, align='left')
    scene45.resizable = False
    scene45.autoscale = True
    scene45.userzoom = False
    scene45.userspin = False
    scene45.userpan = False
    border = 1.3
    curve(pos=[vector(-border, -border, 0), vector(border, -border, 0), vector(border, border, 0), vector(-border, border, 0), vector(-border, -border, 0)], radius=0.004)  # border
    curve(pos=[vector(-1.1, 0, 0), vector(1.1, 0, 0)], radius=0.004)                                        # real axis
    label(pos=vector(1.2, 0, 0), text='v', box=0, opacity=0, color=labelcolor)                              # scale labels (pu)
    label(pos=vector(1, -0.12, 0), text='1', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(1, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(.5, 0, 0), text='|', box=0, opacity=0, color=labelcolor,  height=10)
    label(pos=vector(-.5, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    label(pos=vector(-1, 0, 0), text='|', box=0, opacity=0, color=labelcolor, height=10)
    curve(pos=[vector(0, 1.1, 0), vector(0, -1.1, 0)], radius=0.007, color=axiscolor)                       # imaginary axis
    label(pos=vector(0, 1.2, 0), text='jv', box=0, opacity=0, color=labelcolor)                             # scale labels (pu)
    label(pos=vector(0, 1, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, 0.5, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, -.5, 0), text='--', box=0, opacity=0, color=labelcolor)
    label(pos=vector(0, -1, 0), text='--', box=0, opacity=0, color=labelcolor)
    return scene45


def get_graph12(title, maxy):
    graph12 = graph(width=3 / 4 * scenewidth, height=1 / 2 * sceneheight, title='\n' + title, xtitle='Angle', background=backgroundcolor, foreground=color.gray(0.7), xmin=0, xmax=730, ymin=-maxy, ymax=maxy, align='left')
    xaxis = gcurve(graph=graph12, color=axiscolor)
    yaxis = gcurve(graph=graph12, color=axiscolor)
    xaxis.plot([0, 0], [730, 0])
    yaxis.plot([0, -1], [0, 1])
    return graph12


def multiply(v1, v2):
    mag_v1 = sqrt(v1.x ** 2 + v1.y ** 2)
    mag_v2 = sqrt(v2.x ** 2 + v2.y ** 2)
    angle_v1 = atan2(v1.y, v1.x)
    angle_v2 = atan2(v2.y, v2.x)
    mag_v = mag_v1 * mag_v2
    angle_v = angle_v1 + angle_v2
    result = vector(mag_v * cos(angle_v), mag_v * sin(angle_v), 0)
    return result


def divide(v1, v2):
    mag_v1 = sqrt(v1.x ** 2 + v1.y ** 2)
    mag_v2 = sqrt(v2.x ** 2 + v2.y ** 2)
    angle_v1 = atan2(v1.y, v1.x)
    angle_v2 = atan2(v2.y, v2.x)
    mag_v = mag_v1 / mag_v2
    angle_v = angle_v1 - angle_v2
    result = vector(mag_v * cos(angle_v), mag_v * sin(angle_v), 0)
    return result


def get_angle(v1):
    angle_v1 = atan2(v1.y, v1.x)
    return angle_v1


# =================================================================================================
# --- 3LG --- 3LG --- 3LG -------------------------------------------------------------------------
# --- 3LG --- 3LG --- 3LG -------------------------------------------------------------------------
# --- 3LG --- 3LG --- 3LG -------------------------------------------------------------------------
# =================================================================================================
def abcg(phasekv, z_positive):
    global scenelist

    # ---- CALCULATE 3LG CURRENTS ---------------------------------------------
    iapos = divide(phasekv, z_positive)
    ibpos = multiply(iapos, shiftminus)
    icpos = multiply(iapos, shiftplus)
    iapos_angle = get_angle(iapos)
    ibpos_angle = get_angle(ibpos)
    icpos_angle = get_angle(icpos)

    z_negative = vector(0, 0, 0)
    z_zero = vector(0, 0, 0)

    # --- NORMALIZE CURRENTS --------------------------------------------------
    ibase = iapos.mag
    iapos /= ibase
    ibpos /= ibase
    icpos /= ibase

    # --- SET HEADER ----------------------------------------------------------
    header = get_header('<b>3LG Positive, Negative and Zero Sequence Current Phasors</b>'
                        + '                                                      ', phasekv, z_positive, z_negative, z_zero, ibase)

    # --- SET SCENE1 POSITIVE SEQUENCE (Static) -------------------------------
    scene1 = get_scene123()
    iap = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.03, color=poscolor)
    ibp = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.03, color=poscolor)
    icp = arrow(pos=vector(0, 0, 0), axis=icpos, shaftwidth=0.03, color=poscolor)
    label(pos=1.1 * iapos, text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * ibpos, text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * icpos, text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    aptext = 'A+ = {0:3.1f} \u2220{1:-5.1f}'.format(iapos.mag, degrees(iapos_angle) % 360)
    bptext = 'B+ = {0:3.1f} \u2220{1:-5.1f}'.format(ibpos.mag, degrees(ibpos_angle) % 360)
    cptext = 'C+ = {0:3.1f} \u2220{1:-5.1f}'.format(icpos.mag, degrees(icpos_angle) % 360)
    label(pos=vector(-1.2, -1.2, 0), text=aptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(-1.2, 1.2, 0), text=bptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(1.2, 1.2, 0), text=cptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='right')
    scene1.waitfor('draw_complete')

    # --- SET SCENE2 NEGATIVE SEQUENCE (Static) -------------------------------
    scene2 = get_scene123()
    ntext = 'A- = B- = C- = 0' + u'\u2220' + '0'
    label(pos=vector(-0.5, -1.2, 0), text=ntext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    scene2.waitfor('draw_complete')

    # --- SET SCENE3 ZERO SEQUENCE (Static) -----------------------------------
    scene3 = get_scene123()
    ztext = 'Ao = Bo = Co = 0' + u'\u2220' + '0'
    label(pos=vector(-0.6, -1.2, 0), text=ztext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    scene3.waitfor('draw_complete')

    # --- INITIALIZE SCENE4 ---------------------------------------------------
    scene4 = get_scene45()
    iap = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.02, color=poscolor)
    ibp = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.02, color=poscolor)
    icp = arrow(pos=vector(0, 0, 0), axis=icpos, shaftwidth=0.02, color=poscolor)
    iaplabel = label(pos=(1.07 * iapos), text='A', box=0, color=acolor, opacity=0.0, height=12, align='center')
    ibplabel = label(pos=(1.07 * ibpos), text='B', box=0, color=bcolor, opacity=0.0, height=12, align='center')
    icplabel = label(pos=(1.07 * icpos), text='C', box=0, color=ccolor, opacity=0.0, height=12, align='center')
    a_text = 'A = {0:3.1f} \u2220{1:-5.1f}\nA(\u03F4) = {2:7.4f}'.format(iapos.mag, degrees(iapos_angle) % 360, iapos.x)
    b_text = 'B = {0:3.1f} \u2220{1:-5.1f}\nB(\u03F4) = {2:7.4f}'.format(ibpos.mag, degrees(ibpos_angle) % 360, ibpos.x)
    c_text = 'C = {0:3.1f} \u2220{1:-5.1f}\nC(\u03F4) = {2:7.4f}'.format(icpos.mag, degrees(icpos_angle) % 360, icpos.x)
    alabel = label(pos=vector(0.7, -1.1, 0), text=a_text, box=0, color=acolor, opacity=0.0, height=12, align='left')
    blabel = label(pos=vector(-1.2, 1.2, 0), text=b_text, box=0, color=bcolor, opacity=0.0, height=12, align='left')
    clabel = label(pos=vector(0.7, 1.2, 0), text=c_text, box=0, color=ccolor, opacity=0.0, height=12, align='left')
    raprojectionline = curve(pos=[iap.axis, vector(iap.axis.x, 0, 0)], radius=0.003)
    rbprojectionline = curve(pos=[ibp.axis, vector(ibp.axis.x, 0, 0)], radius=0.003)
    rcprojectionline = curve(pos=[icp.axis, vector(icp.axis.x, 0, 0)], radius=0.003)
    scene4.waitfor('draw_complete')

    # --- INITIALIZE SCENE5 ---------------------------------------------------
    scene5 = get_scene45()
    iap_ = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.02, color=poscolor)
    iap_ibp = arrow(pos=iapos, axis=ibpos, shaftwidth=0.02, color=poscolor)
    iap_ibp_icp = arrow(pos=iapos + ibpos, axis=icpos, shaftwidth=0.02, color=poscolor)
    resultant = iapos + ibpos + icpos
    resultant_angle = 0.0
    iap_rlabel = label(pos=rotate(iapos / 2, angle=label_angle, axis=vec(0, 0, 1)), text='A', box=0, color=acolor, opacity=0.0, height=12, align='center')
    ibp_rlabel = label(pos=iapos + rotate(ibpos / 2, angle=label_angle, axis=vec(0, 0, 1)), text='B', box=0, color=bcolor, opacity=0.0, height=12, align='center')
    icp_rlabel = label(pos=iapos + ibpos + rotate(icpos / 2, angle=label_angle, axis=vec(0, 0, 1)), text='C', box=0, color=ccolor, opacity=0.0, height=12, align='center')
    rlabel = label(pos=0.07 * hat(icpos - iapos), text='ig', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    f_text = 'iground = {0:3.1f} \u2220{1:-3.1f}\nig(\u03F4) = {2:7.4f}'.format(resultant.mag, degrees(resultant_angle) % 360, resultant.x)
    label(pos=vector(0.55, -1.1, 0), text=f_text, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    scene5.waitfor('draw_complete')

    # --- INITIALIZE GRAPH1 ---------------------------------------------------
    graph1 = get_graph12('<b>3LG A,B,C Fault Currents</b>', maxy=1.1)
    ia = gcurve(graph=graph1, color=acolor, label='IA')
    ib = gcurve(graph=graph1, color=bcolor, label='IB')
    ic = gcurve(graph=graph1, color=ccolor, label='IC')

    # --- INITIALIZE GRAPH2 ---------------------------------------------------
    graph2 = get_graph12('<b>3LG Ground Fault Current</b>', maxy=1.1)
    ifault = gcurve(graph=graph2, color=zerocolor, label='Iground')

    # =============================================================================================
    # --- 3LG ANIMATE ROTATING A,B,C PHASE CURRENTS -----------------------------------------------
    # =============================================================================================
    scene4.select()
    for angle in range(0, 720, da):
        rate(speed)
        iapos_angle += rad_da
        ibpos_angle += rad_da
        icpos_angle += rad_da

        # -- UPDATE ARROWS --------------------------------
        iap.axis = rotate(iap.axis, angle=rad_da)
        ibp.axis = rotate(ibp.axis, angle=rad_da)
        icp.axis = rotate(icp.axis, angle=rad_da)

        # -- UPDATE LABELS --------------------------------
        iaplabel.pos = 1.07 * iap.axis
        ibplabel.pos = 1.07 * ibp.axis
        icplabel.pos = 1.07 * icp.axis
        a_text = 'A = {0:3.1f} \u2220{1:-5.1f}\nA(\u03F4) = {2:7.4f}'.format(iap.axis.mag, degrees(iapos_angle) % 360, iap.axis.x)
        b_text = 'B = {0:3.1f} \u2220{1:-5.1f}\nB(\u03F4) = {2:7.4f}'.format(ibp.axis.mag, degrees(ibpos_angle) % 360, ibp.axis.x)
        c_text = 'C = {0:3.1f} \u2220{1:-5.1f}\nC(\u03F4) = {2:7.4f}'.format(icp.axis.mag, degrees(icpos_angle) % 360, icp.axis.x)
        alabel.text = a_text
        blabel.text = b_text
        clabel.text = c_text

        # -- UPDATE PROJECTION LINES ----------------------
        raprojectionline.modify(0, iap.axis)
        raprojectionline.modify(1, vector(iap.axis.x, 0, 0))
        rbprojectionline.modify(0, ibp.axis)
        rbprojectionline.modify(1, vector(ibp.axis.x, 0, 0))
        rcprojectionline.modify(0, icp.axis)
        rcprojectionline.modify(1, vector(icp.axis.x, 0, 0))

        # -- UPDATE GRAPH ---------------------------------
        ia.plot(pos=(angle, iap.axis.x))
        ib.plot(pos=(angle, ibp.axis.x))
        ic.plot(pos=(angle, icp.axis.x))

    # =============================================================================================
    # --- 3LG ANIMATE SUM OF A,B,C PHASE CURRENTS (CURRENT TO GROUND) -----------------------------
    # =============================================================================================
    scene5.select()
    for angle in range(0, 720, da):
        rate(speed)

        # -- UPDATE ARROWS --------------------------------
        iap_.axis = rotate(iap_.axis, angle=rad_da)
        iap_ibp.axis = rotate(iap_ibp.axis, angle=rad_da)
        iap_ibp_icp.axis = rotate(iap_ibp_icp.axis, angle=rad_da)
        iap_.pos = rotate(iap_.pos, angle=rad_da)
        iap_ibp.pos = rotate(iap_ibp.pos, angle=rad_da)
        iap_ibp_icp.pos = rotate(iap_ibp_icp.pos, angle=rad_da)

        # -- UPDATE LABELS --------------------------------
        iap_rlabel.pos = rotate(iap_rlabel.pos, angle=rad_da)
        ibp_rlabel.pos = rotate(ibp_rlabel.pos, angle=rad_da)
        icp_rlabel.pos = rotate(icp_rlabel.pos, angle=rad_da)
        rlabel.pos = rotate(rlabel.pos, angle=rad_da)

        # -- UPDATE GRAPH ---------------------------------
        ifault.plot(pos=(angle, 0.0))

    scenelist = [header, scene1, scene2, scene3, scene4, scene5, graph1, graph2]
    return scenelist


# =================================================================================================
# --- 1LG --- 1LG --- 1LG -------------------------------------------------------------------------
# --- 1LG --- 1LG --- 1LG -------------------------------------------------------------------------
# --- 1LG --- 1LG --- 1LG -------------------------------------------------------------------------
# =================================================================================================
def ag(phasekv, z_positive, z_negative, z_zero):
    global scenelist

    # ---- CALCULATE 1LG CURRENTS ---------------------------------------------
    iapos = divide(phasekv, z_positive + z_negative + z_zero)
    ibpos = multiply(iapos, shiftminus)
    icpos = multiply(iapos, shiftplus)
    iapos_angle = get_angle(iapos)
    ibpos_angle = get_angle(ibpos)
    icpos_angle = get_angle(icpos)

    ianeg = divide(phasekv, z_positive + z_negative + z_zero)
    ibneg = multiply(iapos, shiftplus)
    icneg = multiply(iapos, shiftminus)
    ianeg_angle = get_angle(ianeg)
    ibneg_angle = get_angle(ibneg)
    icneg_angle = get_angle(icneg)

    iz = divide(phasekv, z_positive + z_negative + z_zero)
    iz_angle = get_angle(iz)

    # --- NORMALIZE CURRENTS --------------------------------------------------
    ibase = iapos.mag
    iapos /= ibase
    ibpos /= ibase
    icpos /= ibase
    ianeg /= ibase
    ibneg /= ibase
    icneg /= ibase
    iz /= ibase

    # --- SET LEFT BORDER AND HEADER ------------------------------------------
    # left_border = get_left_border()
    header = get_header('<b>1LG Positive, Negative and Zero Sequence Current Phasors</b>'
                        + '                                                      ', phasekv, z_positive, z_negative, z_zero, ibase)

    # --- SET SCENE1 POSITIVE SEQUENCE (Static) -------------------------------
    scene1 = get_scene123()
    iap = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.03, color=poscolor)
    ibp = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.03, color=poscolor)
    icp = arrow(pos=vector(0, 0, 0), axis=icpos, shaftwidth=0.03, color=poscolor)
    label(pos=1.1 * iapos, text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * ibpos, text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * icpos, text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    aptext = 'A+ = {0:3.1f} \u2220{1:-5.1f}'.format(iapos.mag, degrees(iapos_angle) % 360)
    bptext = 'B+ = {0:3.1f} \u2220{1:-5.1f}'.format(ibpos.mag, degrees(ibpos_angle) % 360)
    cptext = 'C+ = {0:3.1f} \u2220{1:-5.1f}'.format(icpos.mag, degrees(icpos_angle) % 360)
    label(pos=vector(-1.2, -1.2, 0), text=aptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(-1.2, 1.2, 0), text=bptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(1.2, 1.2, 0), text=cptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='right')
    scene1.waitfor('draw_complete')

    # --- SET SCENE2 NEGATIVE SEQUENCE (Static) -------------------------------
    scene2 = get_scene123()
    ian = arrow(pos=vector(0, 0, 0), axis=ianeg, shaftwidth=0.03, color=negcolor)
    icn = arrow(pos=vector(0, 0, 0), axis=icneg, shaftwidth=0.03, color=negcolor)
    ibn = arrow(pos=vector(0, 0, 0), axis=ibneg, shaftwidth=0.03, color=negcolor)
    label(pos=1.1 * ianeg, text='A-', box=0,  color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * icneg, text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * ibneg, text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12)
    antext = 'A- = {0:3.1f} \u2220{1:-5.1f}'.format(ianeg.mag, degrees(ianeg_angle) % 360)
    cntext = 'C- = {0:3.1f} \u2220{1:-5.1f}'.format(icneg.mag, degrees(icneg_angle) % 360)
    bntext = 'B- = {0:3.1f} \u2220{1:-5.1f}'.format(ibneg.mag, degrees(ibneg_angle) % 360)
    label(pos=vector(-1.2, -1.2, 0), text=antext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(-1.2, 1.2, 0), text=cntext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(1.2, 1.2, 0), text=bntext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='right')
    scene2.waitfor('draw_complete')

    # --- SET SCENE3 ZERO SEQUENCE (Static) -----------------------------------
    scene3 = get_scene123()
    iaz = arrow(pos=vector(0, 0, 0), axis=iz, shaftwidth=0.03, color=zerocolor)
    ibz = arrow(pos=vector(0, 0, 0), axis=iz, shaftwidth=0.03, color=zerocolor)
    icz = arrow(pos=vector(0, 0, 0), axis=iz, shaftwidth=0.03, color=zerocolor)
    label(pos=rotate(0.50 * iz, angle=label_angle, axis=vec(0, 0, 1)), text='Ao', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    label(pos=rotate(0.65 * iz, angle=label_angle-radians(2), axis=vec(0, 0, 1)), text='Bo', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    label(pos=rotate(0.80 * iz, angle=label_angle-radians(3), axis=vec(0, 0, 1)), text='Co', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ztext = 'Ao = Bo = Co = {0:3.1f} \u2220{1:-5.1f}'.format(iz.mag, degrees(iz_angle) % 360)
    label(pos=vector(-1.2, -1.2, 0), text=ztext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    scene3.waitfor('draw_complete')

    # -------------------------------------------------------------------------
    # --- INITIALIZE SCENE4 A,B,C SEQUENCE PHASORS ----------------------------
    # -------------------------------------------------------------------------
    scene4 = get_scene45_x3()

    # -- INITIALIZE ARROWS --------------------------------
    iap = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.06, color=poscolor)
    ian = arrow(pos=iapos, axis=ianeg, shaftwidth=0.06, color=negcolor)
    iaz = arrow(pos=iapos + ianeg, axis=iz, shaftwidth=0.06, color=zerocolor)
    ibp = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.06, color=poscolor)
    ibn = arrow(pos=ibpos, axis=ibneg, shaftwidth=0.06, color=negcolor)
    ibz = arrow(pos=ibpos + ibneg, axis=iz, shaftwidth=0.06, color=zerocolor)
    icp = arrow(pos=vector(0, 0, 0), axis=icpos, shaftwidth=0.06, color=poscolor)
    icn = arrow(pos=icpos, axis=icneg, shaftwidth=0.06, color=negcolor)
    icz = arrow(pos=icpos + icneg, axis=iz, shaftwidth=0.06, color=zerocolor)

    # -- INITIALIZE LABELS --------------------------------
    a_resultant = iapos + ianeg + iz
    a_resultant_angle = get_angle(a_resultant)
    iaplabel = label(pos=rotate(iapos / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ianlabel = label(pos=iapos + rotate(ianeg / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='A-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iazlabel = label(pos=iapos + ianeg + rotate(iz / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='Ao', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ialabel = label(pos=(1.05 * a_resultant), text='A', box=0, color=acolor, opacity=0.0, height=12, align='center')
    raprojectionline = curve(pos=[a_resultant, vector(a_resultant.x, 0, 0)], radius=0.009)
    b_resultant = ibpos + ibneg + iz
    ibplabel = label(pos=rotate(ibpos / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibnlabel = label(pos=ibpos + rotate(ibneg / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibzlabel = label(pos=ibpos + ibneg + rotate(iz / 2, angle=-2 * label_angle, axis=vec(0, 0, 1)), text='Bo', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    c_resultant = icpos + icneg + iz
    icplabel = label(pos=rotate(icpos / 2, angle=-2 * label_angle, axis=vec(0, 0, 1)), text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icnlabel = label(pos=icpos + rotate(icneg / 2, angle=-2 * label_angle, axis=vec(0, 0, 1)), text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iczlabel = label(pos=icpos + icneg + rotate(iz / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='Co', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    a_text = 'A = {0:3.1f} \u2220{1:-5.1f}\nA(\u03F4) = {2:7.4f}'.format(a_resultant.mag, degrees(a_resultant_angle) % 360, a_resultant.x)
    b_text = 'B = {0:3.1f} \u2220{1:3.1f}\nB(\u03F4) = {2:3.1f}'.format(0.0, 0.0, 0.0)
    c_text = 'C = {0:3.1f} \u2220{1:3.1f}\nC(\u03F4) = {2:3.1f}'.format(0.0, 0.0, 0.0)
    alabel = label(pos=vector(2.1, -3.3, 0), text=a_text, box=0, color=acolor, opacity=0.0, height=12, align='left')
    blabel = label(pos=vector(-3.6, 3.6, 0), text=b_text, box=0, color=bcolor, opacity=0.0, height=12, align='left')
    clabel = label(pos=vector(2.3, 3.6, 0), text=c_text, box=0, color=ccolor, opacity=0.0, height=12, align='left')
    scene4.waitfor('draw_complete')

    # -------------------------------------------------------------------------
    # --- INITIALIZE SCENE5 SUM OF A,B,C SEQUENCE PHASORS ---------------------
    # -------------------------------------------------------------------------
    scene5 = get_scene45_x3()

    # -- INITIALIZE ARROWS (Positive + Negative) ----------
    ibp_ = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.06, color=poscolor)
    ibn_ = arrow(pos=ibpos, axis=ibneg, shaftwidth=0.06, color=negcolor)
    icp_ = arrow(pos=ibpos + ibneg, axis=icpos, shaftwidth=0.06, color=poscolor)
    icn_ = arrow(pos=ibpos + ibneg + icpos, axis=icneg, shaftwidth=0.06, color=negcolor)
    rcpn = icpos + icneg
    iap_ = arrow(pos=icpos + icneg + ibpos + ibneg, axis=iapos, shaftwidth=0.06, color=poscolor)
    ian_ = arrow(pos=rcpn + ibpos + ibneg + iapos, axis=ianeg, shaftwidth=0.06, color=negcolor)

    # -- INITIALIZE ARROWS (Zero) -------------------------
    iaz_ = arrow(pos=vector(0, 0, 0), axis=iz, shaftwidth=0.06, color=zerocolor)
    ibz_ = arrow(pos=iz, axis=iz, shaftwidth=0.06, color=zerocolor)
    icz_ = arrow(pos=2 * iz, axis=iz, shaftwidth=0.06, color=zerocolor)

    # -- INITIALIZE PROJECTION LINE -----------------------
    abc_resultant = 3 * iz
    abc_resultant_angle = get_angle(abc_resultant)
    rfprojectionline = curve(pos=[abc_resultant, vector(abc_resultant.x, 0, 0)], radius=0.009)

    # -- INITIALIZE LABELS --------------------------------
    ibplabel_ = label(pos=rotate(ibpos / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibnlabel_ = label(pos=ibpos + rotate(ibneg / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icplabel_ = label(pos=ibpos + ibneg + rotate(icpos / 2, angle=-2 * label_angle, axis=vec(0, 0, 1)), text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icnlabel_ = label(pos=ibpos + ibneg + icpos + rotate(icneg / 2, angle=-2 * label_angle, axis=vec(0, 0, 1)), text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iaplabel_ = label(pos=ibpos + ibneg + icpos + icneg + rotate(iapos / 2, angle=-2 * label_angle, axis=vec(0, 0, 1)), text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ianlabel_ = label(pos=ibpos + ibneg + icpos + icneg + iapos + rotate(ianeg / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='A-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iazlabel_ = label(pos=rotate(iz / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='Ao', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibzlabel_ = label(pos=iz + rotate(iz / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='Bo', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iczlabel_ = label(pos=2 * iz + rotate(iz / 2, angle=2 * label_angle, axis=vec(0, 0, 1)), text='Co', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    resultant_label = label(pos=1.07 * abc_resultant, text='ig', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    f_text = 'iground = {0:3.1f} \u2220{1:-5.1f}\nig(\u03F4) = {2:7.4f}'.format(abc_resultant.mag, degrees(abc_resultant_angle) % 360, abc_resultant.x)
    flabel = label(pos=vector(1.5, -3.3, 0), text=f_text, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    scene5.waitfor('draw_complete')

    # -- INITIALIZE GRAPHS --------------------------------
    graph1 = get_graph12('<b>1LG A,B,C Fault Currents</b>', maxy=3.3)
    ia = gcurve(graph=graph1, color=acolor, label='IA')
    ib = gcurve(graph=graph1, color=bcolor, label='IB')
    ic = gcurve(graph=graph1, color=ccolor, label='IC')
    graph2 = get_graph12('<b>1LG Ground Fault Current</b>', maxy=3.3)
    ifault = gcurve(graph=graph2, color=zerocolor, label='Iground')

    # -------------------------------------------------------------------------
    # --- ANIMATE SCENE4 A,B,C SEQUENCE PHASORS -------------------------------
    # -------------------------------------------------------------------------
    scene4.select()
    for angle in range(0, 720, da):
        rate(speed)

        # -- UPDATE ARROWS --------------------------------
        iap.axis = rotate(iap.axis, angle=rad_da)
        ian.axis = rotate(ian.axis, angle=rad_da)
        iaz.axis = rotate(iaz.axis, angle=rad_da)
        iap.pos = rotate(iap.pos,  angle=rad_da)
        ian.pos = rotate(ian.pos,  angle=rad_da)
        iaz.pos = rotate(iaz.pos,  angle=rad_da)
        ibp.axis = rotate(ibp.axis, angle=rad_da)
        ibn.axis = rotate(ibn.axis, angle=rad_da)
        ibz.axis = rotate(ibz.axis, angle=rad_da)
        ibp.pos = rotate(ibp.pos,  angle=rad_da)
        ibn.pos = rotate(ibn.pos,  angle=rad_da)
        ibz.pos = rotate(ibz.pos,  angle=rad_da)
        icp.axis = rotate(icp.axis, angle=rad_da)
        icn.axis = rotate(icn.axis, angle=rad_da)
        icz.axis = rotate(icz.axis, angle=rad_da)
        icp.pos = rotate(icp.pos,  angle=rad_da)
        icn.pos = rotate(icn.pos,  angle=rad_da)
        icz.pos = rotate(icz.pos,  angle=rad_da)

        # -- UPDATE PROJECTION LINE -----------------------
        a_resultant = rotate(a_resultant, angle=rad_da)
        a_resultant_angle += rad_da
        raprojectionline.modify(0, a_resultant)
        raprojectionline.modify(1, vector(a_resultant.x, 0, 0))

        # -- UPDATE LABELS --------------------------------
        iaplabel.pos = rotate(iaplabel.pos, angle=rad_da)
        ianlabel.pos = rotate(ianlabel.pos, angle=rad_da)
        iazlabel.pos = rotate(iazlabel.pos, angle=rad_da)
        ialabel.pos = rotate(ialabel.pos, angle=rad_da)
        ibplabel.pos = rotate(ibplabel.pos, angle=rad_da)
        ibnlabel.pos = rotate(ibnlabel.pos, angle=rad_da)
        ibzlabel.pos = rotate(ibzlabel.pos, angle=rad_da)
        icplabel.pos = rotate(icplabel.pos, angle=rad_da)
        icnlabel.pos = rotate(icnlabel.pos, angle=rad_da)
        iczlabel.pos = rotate(iczlabel.pos, angle=rad_da)
        a_text = 'A = {0:3.1f} \u2220{1:-5.1f}\nA(\u03F4) = {2:7.4f}'.format(a_resultant.mag, degrees(a_resultant_angle) % 360, a_resultant.x)
        alabel.text = a_text

        # -- UPDATE GRAPH --------------------------------
        ia.plot(pos=(angle, a_resultant.x))
        ib.plot(pos=(angle, 0.04))
        ic.plot(pos=(angle, -0.04))

    # -------------------------------------------------------------------------
    # --- ANIMATE SCENE5 A+B+C SEQUENCE PHASORS -------------------------------
    # -------------------------------------------------------------------------
    scene5.select()
    for angle in range(0, 720, da):
        rate(speed)
        abc_resultant_angle += rad_da

        # -- UPDATE ARROWS --------------------------------
        iap_.axis = rotate(iap_.axis, angle=rad_da)
        ian_.axis = rotate(ian_.axis, angle=rad_da)
        iaz_.axis = rotate(iaz_.axis, angle=rad_da)
        iap_.pos = rotate(iap_.pos,  angle=rad_da)
        ian_.pos = rotate(ian_.pos,  angle=rad_da)
        iaz_.pos = rotate(iaz_.pos,  angle=rad_da)
        ibp_.axis = rotate(ibp_.axis, angle=rad_da)
        ibn_.axis = rotate(ibn_.axis, angle=rad_da)
        ibz_.axis = rotate(ibz_.axis, angle=rad_da)
        ibp_.pos = rotate(ibp_.pos,  angle=rad_da)
        ibn_.pos = rotate(ibn_.pos,  angle=rad_da)
        ibz_.pos = rotate(ibz_.pos,  angle=rad_da)
        icp_.axis = rotate(icp_.axis, angle=rad_da)
        icn_.axis = rotate(icn_.axis, angle=rad_da)
        icz_.axis = rotate(icz_.axis, angle=rad_da)
        icp_.pos = rotate(icp_.pos,  angle=rad_da)
        icn_.pos = rotate(icn_.pos,  angle=rad_da)
        icz_.pos = rotate(icz_.pos,  angle=rad_da)

        # -- UPDATE LABELS --------------------------------
        iaplabel_.pos = rotate(iaplabel_.pos, angle=rad_da)
        ianlabel_.pos = rotate(ianlabel_.pos, angle=rad_da)
        iazlabel_.pos = rotate(iazlabel_.pos, angle=rad_da)
        ibplabel_.pos = rotate(ibplabel_.pos, angle=rad_da)
        ibnlabel_.pos = rotate(ibnlabel_.pos, angle=rad_da)
        ibzlabel_.pos = rotate(ibzlabel_.pos, angle=rad_da)
        icplabel_.pos = rotate(icplabel_.pos, angle=rad_da)
        icnlabel_.pos = rotate(icnlabel_.pos, angle=rad_da)
        iczlabel_.pos = rotate(iczlabel_.pos, angle=rad_da)
        resultant_label.pos = rotate(resultant_label.pos, angle=rad_da)
        f_text = 'iground = {0:3.1f} \u2220{1:-5.1f}\nig(\u03F4) = {2:7.4f}'.format(abc_resultant.mag, degrees(abc_resultant_angle) % 360, abc_resultant.x)
        flabel.text = f_text

        # -- UPDATE PROJECTION LINE -----------------------
        abc_resultant = rotate(abc_resultant, angle=rad_da)
        rfprojectionline.modify(0, abc_resultant)
        rfprojectionline.modify(1, vector(abc_resultant.x, 0, 0))

        # -- UPDATE GRAPH --------------------------------
        ifault.plot(pos=(angle, abc_resultant.x))

    scenelist = [header, scene1, scene2, scene3, scene4, scene5, graph1, graph2]
    return scenelist


# =================================================================================================
# --- 2LG --- 2LG --- 2LG -------------------------------------------------------------------------
# --- 2LG --- 2LG --- 2LG -------------------------------------------------------------------------
# --- 2LG --- 2LG --- 2LG -------------------------------------------------------------------------
# =================================================================================================
def bcg(phasekv, z_positive, z_negative, z_zero):
    global scenelist

    # ---- CALCULATE 2LG CURRENTS ---------------------------------------------
    num = multiply(negativez, z_zero)
    denom = z_negative + z_zero
    zeq = divide(num, denom)
    iapos = divide(phasekv, z_positive + zeq)
    num = -1 * multiply(iapos, zeroz)
    ianeg = divide(num, denom)
    iapos_angle = get_angle(iapos)
    ianeg_angle = get_angle(ianeg)

    ibpos = multiply(iapos, shiftminus)
    ibneg = multiply(ianeg, shiftplus)
    ibpos_angle = get_angle(ibpos)
    ibneg_angle = get_angle(ibneg)

    icpos = multiply(iapos, shiftplus)
    icneg = multiply(ianeg, shiftminus)
    icpos_angle = get_angle(icpos)
    icneg_angle = get_angle(icneg)

    num = -1 * multiply(iapos, z_negative)
    iz = divide(num, denom)
    iz_angle = get_angle(iz)

    # --- NORMALIZE CURRENTS --------------------------------------------------
    ibase = iapos.mag
    iapos /= ibase
    ibpos /= ibase
    icpos /= ibase
    ianeg /= ibase
    ibneg /= ibase
    icneg /= ibase
    iz /= ibase

    # --- SET HEADER ----------------------------------------------------------
    header = get_header('<b>2LG Positive, Negative and Zero Sequence Current Phasors</b>'
                        + '                                                      ', phasekv, z_positive, z_negative, z_zero, ibase)

    # --- SET SCENE1 POSITIVE SEQUENCE (Static) -------------------------------
    scene1 = get_scene123()
    iap = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.03, color=poscolor)
    ibp = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.03, color=poscolor)
    icp = arrow(pos=vector(0, 0, 0), axis=icpos, shaftwidth=0.03, color=poscolor)
    label(pos=1.1 * iapos, text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * ibpos, text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * icpos, text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    aptext = 'A+ = {0:3.1f} \u2220{1:-5.1f}'.format(iapos.mag, degrees(iapos_angle) % 360)
    bptext = 'B+ = {0:3.1f} \u2220{1:-5.1f}'.format(ibpos.mag, degrees(ibpos_angle) % 360)
    cptext = 'C+ = {0:3.1f} \u2220{1:-5.1f}'.format(icpos.mag, degrees(icpos_angle) % 360)
    label(pos=vector(-1.2, -1.2, 0), text=aptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(-1.2, 1.2, 0), text=bptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(1.2, 1.2, 0), text=cptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='right')
    scene1.waitfor('draw_complete')

    # --- SET SCENE2 NEGATIVE SEQUENCE (Static) -------------------------------
    scene2 = get_scene123()
    ian = arrow(pos=vector(0, 0, 0), axis=ianeg, shaftwidth=0.03, color=negcolor)
    icn = arrow(pos=vector(0, 0, 0), axis=icneg, shaftwidth=0.03, color=negcolor)
    ibn = arrow(pos=vector(0, 0, 0), axis=ibneg, shaftwidth=0.03, color=negcolor)
    label(pos=1.1 * ianeg, text='A-', box=0,  color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * icneg, text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * ibneg, text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12)
    antext = 'A- = {0:4.2f} \u2220{1:-5.1f}'.format(ianeg.mag, degrees(ianeg_angle) % 360)
    cntext = 'C- = {0:4.2f} \u2220{1:-5.1f}'.format(icneg.mag, degrees(icneg_angle) % 360)
    bntext = 'B- = {0:4.2f} \u2220{1:-5.1f}'.format(ibneg.mag, degrees(ibneg_angle) % 360)
    label(pos=vector(-1.2, -1.2, 0), text=antext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(-1.2, 1.2, 0), text=cntext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(1.2, 1.2, 0), text=bntext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='right')
    scene2.waitfor('draw_complete')

    # --- SET SCENE3 ZERO SEQUENCE (Static) -----------------------------------
    scene3 = get_scene123_x2()
    iaz = arrow(pos=vector(0, 0, 0), axis=iz, shaftwidth=0.015, color=zerocolor)
    ibz = arrow(pos=vector(0, 0, 0), axis=iz, shaftwidth=0.015, color=zerocolor)
    icz = arrow(pos=vector(0, 0, 0), axis=iz, shaftwidth=0.015, color=zerocolor)
    label(pos=0.30 * iz + vector(-0.07, 0, 0),  text='Ao', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    label(pos=0.50 * iz + vector(-0.07, 0, 0),  text='Bo', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    label(pos=0.70 * iz + vector(-0.07, 0, 0),  text='Co', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ztext = 'Ao = Bo = Co = {0:4.2f} \u2220{1:-5.1f}'.format(iz.mag, degrees(iz_angle) % 360)
    label(pos=vector(-0.6, -0.6, 0), text=ztext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    scene3.waitfor('draw_complete')

    # -------------------------------------------------------------------------
    # --- INITIALIZE SCENE4 A,B,C SEQUENCE PHASORS ----------------------------
    # -------------------------------------------------------------------------
    scene4 = get_scene45_x2()

    # -- INITIALIZE ARROWS --------------------------------
    iap = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.04, color=poscolor)
    ian = arrow(pos=iapos, axis=ianeg, shaftwidth=0.04, color=negcolor)
    iaz = arrow(pos=iapos + ianeg, axis=iz, shaftwidth=0.04, color=zerocolor)
    ibp = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.04, color=poscolor)
    ibn = arrow(pos=ibpos, axis=ibneg, shaftwidth=0.04, color=negcolor)
    ibz = arrow(pos=ibpos + ibneg, axis=iz, shaftwidth=0.04, color=zerocolor)
    icp = arrow(pos=vector(0, 0, 0), axis=icpos, shaftwidth=0.04, color=poscolor)
    icn = arrow(pos=icpos, axis=icneg, shaftwidth=0.04, color=negcolor)
    icz = arrow(pos=icpos + icneg, axis=iz, shaftwidth=0.04, color=zerocolor)

    # -- INITIALIZE PROJECTION LINES ----------------------
    a_resultant = vector(0, 0, 0)
    b_resultant = ibpos + ibneg + iz
    c_resultant = icpos + icneg + iz
    a_resultant_angle = 0.0
    b_resultant_angle = get_angle(b_resultant)
    c_resultant_angle = get_angle(c_resultant)
    rbprojectionline = curve(pos=[b_resultant, vector(b_resultant.x, 0, 0)], radius=0.006)
    rcprojectionline = curve(pos=[c_resultant, vector(c_resultant.x, 0, 0)], radius=0.006)

    # -- INITIALIZE LABELS --------------------------------
    iaplabel = label(pos=rotate(iapos / 2, angle=-radians(18), axis=vec(0, 0, 1)), text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ianlabel = label(pos=iapos + rotate(ianeg / 2, angle=-radians(30), axis=vec(0, 0, 1)), text='A-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iazlabel = label(pos=iapos + ianeg + rotate(iz / 2, angle=-radians(44), axis=vec(0, 0, 1)), text='Ao', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibplabel = label(pos=rotate(ibpos / 2, angle=-radians(15), axis=vec(0, 0, 1)), text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibnlabel = label(pos=ibpos + rotate(ibneg / 2, angle=-radians(24), axis=vec(0, 0, 1)), text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibzlabel = label(pos=ibpos + ibneg + iz / 2 + vector(-0.15, 0, 0),  text='Bo', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icplabel = label(pos=rotate(icpos / 2, angle=radians(15), axis=vec(0, 0, 1)), text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icnlabel = label(pos=icpos + rotate(icneg / 2, angle=radians(24), axis=vec(0, 0, 1)), text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iczlabel = label(pos=icpos + icneg + iz / 2 + vector(0.15, 0, 0),  text='Co', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ialabel = label(pos=0.12 * iz.hat, text='A', box=0, color=acolor, opacity=0.0, height=12, align='center')
    iblabel = label(pos=ibpos + ibneg + 1.3 * iz, text='B', box=0, color=bcolor, opacity=0.0, height=12, align='center')
    iclabel = label(pos=icpos + icneg + 1.3 * iz, text='C', box=0, color=ccolor, opacity=0.0, height=12, align='center')
    a_text = 'A = {0:3.1f} \u2220{1:-3.1f}\nA(\u03F4) = {2:4.1f}'.format(a_resultant.mag, degrees(a_resultant_angle) % 360, a_resultant.x)
    b_text = 'B = {0:4.2f} \u2220{1:-5.1f}\nB(\u03F4) = {2:7.4f}'.format(b_resultant.mag, degrees(b_resultant_angle) % 360, b_resultant.x)
    c_text = 'C = {0:4.2f} \u2220{1:-5.1f}\nC(\u03F4) = {2:7.4f}'.format(c_resultant.mag, degrees(c_resultant_angle) % 360, c_resultant.x)
    alabel = label(pos=vector(1.55, -2.2, 0), text=a_text, box=0, color=acolor, opacity=0.0, height=12, align='left')
    blabel = label(pos=vector(-2.4, 2.4, 0), text=b_text, box=0, color=bcolor, opacity=0.0, height=12, align='left')
    clabel = label(pos=vector(1.3, 2.4, 0), text=c_text, box=0, color=ccolor, opacity=0.0, height=12, align='left')

    scene4.waitfor('draw_complete')

    # -------------------------------------------------------------------------
    # --- INITIALIZE SCENE5 SUM OF A,B,C SEQUENCE PHASORS ---------------------
    # -------------------------------------------------------------------------
    scene5 = get_scene45_x2()

    # -- INITIALIZE ARROWS (Positive + Negative) ----------
    iap_ = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.04, color=poscolor)
    ibp_ = arrow(pos=iapos, axis=ibpos, shaftwidth=0.04, color=poscolor)
    icp_ = arrow(pos=iapos + ibpos, axis=icpos, shaftwidth=0.04, color=poscolor)
    icn_ = arrow(pos=iapos, axis=icneg, shaftwidth=0.04, color=negcolor)
    ibn_ = arrow(pos=iapos + icneg, axis=ibneg, shaftwidth=0.04, color=negcolor)
    ian_ = arrow(pos=iapos + icneg + ibneg, axis=ianeg, shaftwidth=0.04, color=negcolor)

    # -- INITIALIZE ARROWS (Zero) -------------------------
    iaz_ = arrow(pos=vector(0, 0, 0), axis=iz, shaftwidth=0.04, color=zerocolor)
    ibz_ = arrow(pos=iz, axis=iz, shaftwidth=0.04, color=zerocolor)
    icz_ = arrow(pos=2 * iz, axis=iz, shaftwidth=0.04, color=zerocolor)

    # -- INITIALIZE PROJECTION LINE -----------------------
    abc_resultant = 3 * iz
    abc_resultant_angle = get_angle(abc_resultant)
    rfprojectionline = curve(pos=[abc_resultant, vector(abc_resultant.x, 0, 0)], radius=0.0045)

    # -- INITIALIZE LABELS --------------------------------
    iaplabel_ = label(pos=rotate(iapos / 2, angle=radians(18), axis=vec(0, 0, 1)), text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibplabel_ = label(pos=iapos + rotate(ibpos / 2, angle=radians(18), axis=vec(0, 0, 1)), text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icplabel_ = label(pos=iapos + ibpos + rotate(icpos / 2, angle=radians(18), axis=vec(0, 0, 1)), text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icnlabel_ = label(pos=iapos + rotate(icneg / 2, angle=radians(25), axis=vec(0, 0, 1)), text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibnlabel_ = label(pos=iapos + icneg + rotate(ibneg / 2, angle=radians(25), axis=vec(0, 0, 1)), text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ianlabel_ = label(pos=iapos + icneg + ibneg + rotate(ianeg / 2, angle=radians(25), axis=vec(0, 0, 1)), text='A-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iazlabel_ = label(pos=iz / 2 + vector(-0.15, 0, 0),  text='Ao', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibzlabel_ = label(pos=iz + iz / 2 + vector(-0.15, 0, 0),  text='Bo', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    iczlabel_ = label(pos=2 * iz + iz / 2 + vector(-0.15, 0, 0),  text='Co', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    resultant_label = label(pos=1.1 * abc_resultant, text='ig', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    f_text = 'iground = {0:4.2f} \u2220{1:-5.1f}\nig(\u03F4) = {2:7.4f}'.format(abc_resultant.mag, degrees(abc_resultant_angle) % 360, abc_resultant.x)
    flabel = label(pos=vector(0.9, -2.2, 0), text=f_text, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    scene5.waitfor('draw_complete')

    # -- INITIALIZE GRAPHS --------------------------------
    graph1 = get_graph12('<b>2LG A,B,C Fault Currents</b>', maxy=2.2)
    ia = gcurve(graph=graph1, color=acolor, label='IA')
    ib = gcurve(graph=graph1, color=bcolor, label='IB')
    ic = gcurve(graph=graph1, color=ccolor, label='IC')
    graph2 = get_graph12('<b>2LG Ground Fault Current</b>', maxy=2.2)
    ifault = gcurve(graph=graph2, color=zerocolor, label='Iground')

    # -------------------------------------------------------------------------
    # --- ANIMATE SCENE4 A,B,C SEQUENCE PHASORS -------------------------------
    # -------------------------------------------------------------------------
    scene4.select()
    for angle in range(0, 720, da):
        rate(speed)

        # -- UPDATE ARROWS --------------------------------
        iap.axis = rotate(iap.axis, angle=rad_da)
        ian.axis = rotate(ian.axis, angle=rad_da)
        iaz.axis = rotate(iaz.axis, angle=rad_da)
        iap.pos = rotate(iap.pos,  angle=rad_da)
        ian.pos = rotate(ian.pos,  angle=rad_da)
        iaz.pos = rotate(iaz.pos,  angle=rad_da)
        ibp.axis = rotate(ibp.axis, angle=rad_da)
        ibn.axis = rotate(ibn.axis, angle=rad_da)
        ibz.axis = rotate(ibz.axis, angle=rad_da)
        ibp.pos = rotate(ibp.pos,  angle=rad_da)
        ibn.pos = rotate(ibn.pos,  angle=rad_da)
        ibz.pos = rotate(ibz.pos,  angle=rad_da)
        icp.axis = rotate(icp.axis, angle=rad_da)
        icn.axis = rotate(icn.axis, angle=rad_da)
        icz.axis = rotate(icz.axis, angle=rad_da)
        icp.pos = rotate(icp.pos,  angle=rad_da)
        icn.pos = rotate(icn.pos,  angle=rad_da)
        icz.pos = rotate(icz.pos,  angle=rad_da)

        # -- UPDATE PROJECTION LINE -----------------------
        a_resultant = rotate(a_resultant, angle=rad_da)
        b_resultant = rotate(b_resultant, angle=rad_da)
        c_resultant = rotate(c_resultant, angle=rad_da)
        b_resultant_angle = get_angle(b_resultant)
        c_resultant_angle = get_angle(c_resultant)
        rbprojectionline.modify(0, b_resultant)
        rbprojectionline.modify(1, vector(b_resultant.x, 0, 0))
        rcprojectionline.modify(0, c_resultant)
        rcprojectionline.modify(1, vector(c_resultant.x, 0, 0))

        # -- UPDATE LABELS --------------------------------
        iaplabel.pos = rotate(iaplabel.pos, angle=rad_da)
        ianlabel.pos = rotate(ianlabel.pos, angle=rad_da)
        iazlabel.pos = rotate(iazlabel.pos, angle=rad_da)
        ialabel.pos = rotate(ialabel.pos, angle=rad_da)
        ibplabel.pos = rotate(ibplabel.pos, angle=rad_da)
        ibnlabel.pos = rotate(ibnlabel.pos, angle=rad_da)
        ibzlabel.pos = rotate(ibzlabel.pos, angle=rad_da)
        iblabel.pos = rotate(iblabel.pos, angle=rad_da)
        icplabel.pos = rotate(icplabel.pos, angle=rad_da)
        icnlabel.pos = rotate(icnlabel.pos, angle=rad_da)
        iczlabel.pos = rotate(iczlabel.pos, angle=rad_da)
        iclabel.pos = rotate(iclabel.pos, angle=rad_da)
        b_text = 'B = {0:4.2f} \u2220{1:-5.1f}\nA(\u03F4) = {2:7.4f}'.format(b_resultant.mag, degrees(b_resultant_angle) % 360, b_resultant.x)
        c_text = 'C = {0:4.2f} \u2220{1:-5.1f}\nB(\u03F4) = {2:7.4f}'.format(c_resultant.mag, degrees(c_resultant_angle) % 360, c_resultant.x)
        alabel.text = a_text
        blabel.text = b_text
        clabel.text = c_text

        # -- UPDATE GRAPH --------------------------------
        ia.plot(pos=(angle, a_resultant.x))
        ib.plot(pos=(angle, b_resultant.x))
        ic.plot(pos=(angle, c_resultant.x))

    # -------------------------------------------------------------------------
    # --- ANIMATE SCENE5 A+B+C SEQUENCE PHASORS -------------------------------
    # -------------------------------------------------------------------------
    scene5.select()
    for angle in range(0, 720, da):
        rate(speed)
        abc_resultant_angle += rad_da

        # -- UPDATE ARROWS --------------------------------
        iap_.axis = rotate(iap_.axis, angle=rad_da)
        ian_.axis = rotate(ian_.axis, angle=rad_da)
        iaz_.axis = rotate(iaz_.axis, angle=rad_da)
        iap_.pos = rotate(iap_.pos,  angle=rad_da)
        ian_.pos = rotate(ian_.pos,  angle=rad_da)
        iaz_.pos = rotate(iaz_.pos,  angle=rad_da)
        ibp_.axis = rotate(ibp_.axis, angle=rad_da)
        ibn_.axis = rotate(ibn_.axis, angle=rad_da)
        ibz_.axis = rotate(ibz_.axis, angle=rad_da)
        ibp_.pos = rotate(ibp_.pos,  angle=rad_da)
        ibn_.pos = rotate(ibn_.pos,  angle=rad_da)
        ibz_.pos = rotate(ibz_.pos,  angle=rad_da)
        icp_.axis = rotate(icp_.axis, angle=rad_da)
        icn_.axis = rotate(icn_.axis, angle=rad_da)
        icz_.axis = rotate(icz_.axis, angle=rad_da)
        icp_.pos = rotate(icp_.pos,  angle=rad_da)
        icn_.pos = rotate(icn_.pos,  angle=rad_da)
        icz_.pos = rotate(icz_.pos,  angle=rad_da)

        # -- UPDATE LABELS --------------------------------
        iaplabel_.pos = rotate(iaplabel_.pos, angle=rad_da)
        ianlabel_.pos = rotate(ianlabel_.pos, angle=rad_da)
        iazlabel_.pos = rotate(iazlabel_.pos, angle=rad_da)
        ibplabel_.pos = rotate(ibplabel_.pos, angle=rad_da)
        ibnlabel_.pos = rotate(ibnlabel_.pos, angle=rad_da)
        ibzlabel_.pos = rotate(ibzlabel_.pos, angle=rad_da)
        icplabel_.pos = rotate(icplabel_.pos, angle=rad_da)
        icnlabel_.pos = rotate(icnlabel_.pos, angle=rad_da)
        iczlabel_.pos = rotate(iczlabel_.pos, angle=rad_da)
        resultant_label.pos = rotate(resultant_label.pos, angle=rad_da)
        f_text = 'iground = {0:4.2f} \u2220{1:-5.1f}\nig(\u03F4) = {2:7.4f}'.format(abc_resultant.mag, degrees(abc_resultant_angle) % 360, abc_resultant.x)
        flabel.text = f_text

        # -- UPDATE PROJECTION LINE -----------------------
        abc_resultant = rotate(abc_resultant, angle=rad_da)
        rfprojectionline.modify(0, abc_resultant)
        rfprojectionline.modify(1, vector(abc_resultant.x, 0, 0))

        # -- UPDATE GRAPH --------------------------------
        ifault.plot(pos=(angle, abc_resultant.x))

    scenelist = [header, scene1, scene2, scene3, scene4, scene5, graph1, graph2]
    return scenelist


# =================================================================================================
# --- LL --- LL --- LL ----------------------------------------------------------------------------
# --- LL --- LL --- LL ----------------------------------------------------------------------------
# --- LL --- LL --- LL ----------------------------------------------------------------------------
# =================================================================================================
def bc(phasekv, z_positive, z_negative):
    global scenelist
    z_zero = vector(0, 0, 0)

    # ---- CALCULATE LL CURRENTS ----------------------------------------------
    iapos = divide(phasekv, z_positive + z_negative)
    ianeg = -iapos
    iapos_angle = get_angle(iapos)
    ianeg_angle = get_angle(ianeg)

    ibpos = multiply(iapos, shiftminus)
    ibneg = multiply(ianeg, shiftplus)
    ibpos_angle = get_angle(ibpos)
    ibneg_angle = get_angle(ibneg)

    icpos = multiply(iapos, shiftplus)
    icneg = multiply(ianeg, shiftminus)
    icpos_angle = get_angle(icpos)
    icneg_angle = get_angle(icneg)

    # ---- CALCULATE LL VOLTAGES ----------------------------------------------
    vapos = phasekv - multiply(iapos, z_positive)
    vaneg = -1 * multiply(ianeg, z_negative)
    vbpos = multiply(vapos, shiftminus)
    vbneg = multiply(vaneg, shiftplus)
    vcpos = multiply(vapos, shiftplus)
    vcneg = multiply(vaneg, shiftminus)

    # --- NORMALIZE CURRENTS --------------------------------------------------
    ibase = iapos.mag
    iapos /= ibase
    ibpos /= ibase
    icpos /= ibase
    ianeg /= ibase
    ibneg /= ibase
    icneg /= ibase

    # --- NORMALIZE VOLTAGES --------------------------------------------------
    vbase = phasekv.mag
    vapos /= vbase
    vaneg /= vbase
    vbpos /= vbase
    vbneg /= vbase
    vcpos /= vbase
    vcneg /= vbase

    # --- SET HEADER ----------------------------------------------------------
    header = get_header('<b>LL Positive, Negative, Zero Sequence Current and Voltage Phasors</b>'
                        + '                                          ', phasekv, z_positive, z_negative, z_zero, ibase)

    # --- SET SCENE1 POSITIVE SEQUENCE (Static) -------------------------------
    scene1 = get_scene123()
    iap = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.03, color=poscolor)
    ibp = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.03, color=poscolor)
    icp = arrow(pos=vector(0, 0, 0), axis=icpos, shaftwidth=0.03, color=poscolor)
    label(pos=1.1 * iapos, text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * ibpos, text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * icpos, text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12)
    aptext = 'A+ = {0:3.1f} \u2220{1:-5.1f}'.format(iapos.mag, degrees(iapos_angle) % 360)
    bptext = 'B+ = {0:3.1f} \u2220{1:-5.1f}'.format(ibpos.mag, degrees(ibpos_angle) % 360)
    cptext = 'C+ = {0:3.1f} \u2220{1:-5.1f}'.format(icpos.mag, degrees(icpos_angle) % 360)
    label(pos=vector(-1.2, -1.2, 0), text=aptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(-1.2, 1.2, 0), text=bptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(1.2, 1.2, 0), text=cptext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='right')
    scene1.waitfor('draw_complete')

    # --- SET SCENE2 NEGATIVE SEQUENCE (Static) -------------------------------
    scene2 = get_scene123()
    ian = arrow(pos=vector(0, 0, 0), axis=ianeg, shaftwidth=0.03, color=negcolor)
    icn = arrow(pos=vector(0, 0, 0), axis=icneg, shaftwidth=0.03, color=negcolor)
    ibn = arrow(pos=vector(0, 0, 0), axis=ibneg, shaftwidth=0.03, color=negcolor)
    label(pos=1.1 * ianeg, text='A-', box=0,  color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * icneg, text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12)
    label(pos=1.1 * ibneg, text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12)
    antext = 'A- = {0:4.2f} \u2220{1:-5.1f}'.format(ianeg.mag, degrees(ianeg_angle) % 360)
    cntext = 'C- = {0:4.2f} \u2220{1:-5.1f}'.format(icneg.mag, degrees(icneg_angle) % 360)
    bntext = 'B- = {0:4.2f} \u2220{1:-5.1f}'.format(ibneg.mag, degrees(ibneg_angle) % 360)
    label(pos=vector(-1.2, -1.2, 0), text=antext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(-1.2, 1.2, 0), text=cntext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    label(pos=vector(1.2, 1.2, 0), text=bntext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='right')
    scene2.waitfor('draw_complete')

    # --- SET SCENE3 ZERO SEQUENCE (Static) -----------------------------------
    scene3 = get_scene123()
    ztext = 'Ao = Bo = Co = 0' + u'\u2220' + '0'
    label(pos=vector(-0.6, -1.2, 0), text=ztext, box=0, color=r_labelcolor, opacity=0.0, height=12, align='left')
    scene3.waitfor('draw_complete')

    # -------------------------------------------------------------------------
    # --- INITIALIZE SCENE4 A,B,C SEQUENCE PHASORS ----------------------------
    # -------------------------------------------------------------------------
    scene4 = get_scene45_x2()

    # -- INITIALIZE ARROWS --------------------------------
    iap = arrow(pos=vector(0, 0, 0), axis=iapos, shaftwidth=0.04, color=poscolor)
    ian = arrow(pos=iapos, axis=ianeg, shaftwidth=0.04, color=negcolor)
    ibp = arrow(pos=vector(0, 0, 0), axis=ibpos, shaftwidth=0.04, color=poscolor)
    ibn = arrow(pos=ibpos, axis=ibneg, shaftwidth=0.04, color=negcolor)
    icp = arrow(pos=vector(0, 0, 0), axis=icpos, shaftwidth=0.04, color=poscolor)
    icn = arrow(pos=icpos, axis=icneg, shaftwidth=0.04, color=negcolor)

    # -- INITIALIZE PROJECTION LINES ----------------------
    a_resultant = vector(0, 0, 0)
    b_resultant = ibpos + ibneg
    c_resultant = icpos + icneg
    a_resultant_angle = 0.0
    b_resultant_angle = get_angle(b_resultant)
    c_resultant_angle = get_angle(c_resultant)
    rbprojectionline = curve(pos=[b_resultant, vector(b_resultant.x, 0, 0)], radius=0.006)
    rcprojectionline = curve(pos=[c_resultant, vector(c_resultant.x, 0, 0)], radius=0.006)

    # -- INITIALIZE LABELS --------------------------------
    iaplabel = label(pos=rotate(iapos / 2, angle=-radians(15), axis=vec(0, 0, 1)), text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ianlabel = label(pos=iapos + rotate(ianeg / 2, angle=-radians(15), axis=vec(0, 0, 1)), text='A-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibplabel = label(pos=rotate(ibpos / 2, angle=-radians(15), axis=vec(0, 0, 1)), text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ibnlabel = label(pos=ibpos + rotate(ibneg / 2, angle=-radians(15), axis=vec(0, 0, 1)), text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icplabel = label(pos=rotate(icpos / 2, angle=radians(15), axis=vec(0, 0, 1)), text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    icnlabel = label(pos=icpos + rotate(icneg / 2, angle=radians(15), axis=vec(0, 0, 1)), text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    ialabel = label(pos=0.12 * ianeg.hat, text='A', box=0, color=acolor, opacity=0.0, height=12, align='center')
    iblabel = label(pos=ibpos + 1.07 * ibneg, text='B', box=0, color=bcolor, opacity=0.0, height=12, align='center')
    iclabel = label(pos=icpos + 1.07 * icneg, text='C', box=0, color=ccolor, opacity=0.0, height=12, align='center')
    a_text = 'A = {0:3.1f} \u2220{1:4.1f}\nA(\u03F4) = {2:4.1f}'.format(a_resultant.mag, degrees(a_resultant_angle) % 360, a_resultant.x)
    b_text = 'B = {0:4.2f} \u2220{1:-5.1f}\nB(\u03F4) = {2:7.4f}'.format(b_resultant.mag, degrees(b_resultant_angle) % 360, b_resultant.x)
    c_text = 'C = {0:4.2f} \u2220{1:-5.1f}\nC(\u03F4) = {2:7.4f}'.format(c_resultant.mag, degrees(c_resultant_angle) % 360, c_resultant.x)
    alabel = label(pos=vector(1.5, -2.2, 0), text=a_text, box=0, color=acolor, opacity=0.0, height=12, align='left')
    blabel = label(pos=vector(-2.45, 2.4, 0), text=b_text, box=0, color=bcolor, opacity=0.0, height=12, align='left')
    clabel = label(pos=vector(1.3, 2.4, 0), text=c_text, box=0, color=ccolor, opacity=0.0, height=12, align='left')

    # -------------------------------------------------------------------------
    # --- INITIALIZE SCENE5 A,B,C PHASOR VOLTAGES -----------------------------
    # -------------------------------------------------------------------------
    scene5 = get_scene5_v()

    # -- INITIALIZE ARROWS --------------------------------
    vap = arrow(pos=vector(0, 0, 0), axis=vapos, shaftwidth=0.02, color=vposcolor)
    van = arrow(pos=vapos, axis=vaneg, shaftwidth=0.02, color=vnegcolor)
    vbp = arrow(pos=vector(0, 0, 0), axis=vbpos, shaftwidth=0.02, color=vposcolor)
    vbn = arrow(pos=vbpos, axis=vbneg, shaftwidth=0.02, color=vnegcolor)
    vcp = arrow(pos=vector(0, 0, 0), axis=vcpos, shaftwidth=0.02, color=vposcolor)
    vcn = arrow(pos=vcpos, axis=vcneg, shaftwidth=0.02, color=vnegcolor)

    # -- INITIALIZE PROJECTION LINES ----------------------
    va_resultant = vapos + vaneg
    vb_resultant = vbpos + vbneg
    vc_resultant = vcpos + vcneg
    va_resultant_angle = get_angle(va_resultant)
    vb_resultant_angle = get_angle(vb_resultant)
    vc_resultant_angle = get_angle(vc_resultant)
    vaprojectionline = curve(pos=[va_resultant, vector(va_resultant.x, 0, 0)], radius=0.003)
    vbprojectionline = curve(pos=[vb_resultant, vector(vb_resultant.x, 0, 0)], radius=0.003)
    vcprojectionline = curve(pos=[vc_resultant, vector(vc_resultant.x, 0, 0)], radius=0.003)

    # -- INITIALIZE LABELS --------------------------------
    vaplabel = label(pos=rotate(vapos / 2, angle=radians(18), axis=vec(0, 0, 1)), text='A+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    vanlabel = label(pos=vapos + rotate(vaneg / 2, angle=radians(18), axis=vec(0, 0, 1)), text='A-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    vbplabel = label(pos=rotate(vbpos / 2, angle=radians(18), axis=vec(0, 0, 1)), text='B+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    vbnlabel = label(pos=vbpos + rotate(vbneg / 2, angle=radians(18), axis=vec(0, 0, 1)), text='B-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    vcplabel = label(pos=rotate(vcpos / 2, angle=-radians(18), axis=vec(0, 0, 1)), text='C+', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')
    vcnlabel = label(pos=vcpos + rotate(vcneg / 2, angle=-radians(18), axis=vec(0, 0, 1)), text='C-', box=0, color=r_labelcolor, opacity=0.0, height=12, align='center')

    valabel = label(pos=1.05 * (vapos + vaneg), text='A', box=0, color=vacolor, opacity=0.0, height=12, align='center')
    vblabel = label(pos=vbpos + rotate(0.95 * vbneg, angle=radians(10), axis=vec(0, 0, 1)), text='B', box=0, color=vbcolor, opacity=0.0, height=12, align='center')
    vclabel = label(pos=vcpos + rotate(0.95 * vcneg, angle=-radians(10), axis=vec(0, 0, 1)), text='C', box=0, color=vccolor, opacity=0.0, height=12, align='center')

    atext_ = 'Va = {0:4.2f} \u2220{1:4.1f}\nVa(\u03F4) = {2:7.4f}'.format(va_resultant.mag, degrees(va_resultant_angle) % 360, va_resultant.x)
    btext_ = 'Vb = {0:4.2f} \u2220{1:4.1f}\nVb(\u03F4) = {2:7.4f}'.format(vb_resultant.mag, degrees(vb_resultant_angle) % 360, vb_resultant.x)
    ctext_ = 'Vc = {0:4.2f} \u2220{1:4.1f}\nVc(\u03F4) = {2:7.4f}'.format(vc_resultant.mag, degrees(vc_resultant_angle) % 360, vc_resultant.x)
    alabel_ = label(pos=vector(0.63, -1.1, 0), text=atext_, box=0, color=vacolor, opacity=0.0, height=12, align='left')
    blabel_ = label(pos=vector(-1.2, -1.1, 0), text=btext_, box=0, color=vbcolor, opacity=0.0, height=12, align='left')
    clabel_ = label(pos=vector(-1.2, 1.2, 0), text=ctext_, box=0, color=vccolor, opacity=0.0, height=12, align='left')

    # -- INITIALIZE GRAPHS --------------------------------
    graph1 = get_graph12('<b>LL A,B,C Fault Currents</b>', maxy=2.2)
    ia = gcurve(graph=graph1, color=acolor, label='IA')
    ib = gcurve(graph=graph1, color=bcolor, label='IB')
    ic = gcurve(graph=graph1, color=ccolor, label='IC')
    ifault = gcurve(graph=graph1, color=zerocolor, label='Ig')

    graph2 = get_graph12('<b>Vab,Vbc,Vca Fault Voltages (pu)</b>', maxy=2.2)
    vab = gcurve(graph=graph2, color=vabcolor, label='Vab')
    vbc = gcurve(graph=graph2, color=vbccolor, label='Vbc')
    vca = gcurve(graph=graph2, color=vcacolor, label='Vca')

    # -------------------------------------------------------------------------
    # --- ANIMATE SCENE4 A,B,C SEQUENCE PHASORS -------------------------------
    # -------------------------------------------------------------------------
    scene4.select()
    for angle in range(0, 720, da):
        rate(speed)

        # -- UPDATE ARROWS --------------------------------
        iap.axis = rotate(iap.axis, angle=rad_da)
        ian.axis = rotate(ian.axis, angle=rad_da)
        iap.pos = rotate(iap.pos, angle=rad_da)
        ian.pos = rotate(ian.pos, angle=rad_da)
        ibp.axis = rotate(ibp.axis, angle=rad_da)
        ibn.axis = rotate(ibn.axis, angle=rad_da)
        ibp.pos = rotate(ibp.pos, angle=rad_da)
        ibn.pos = rotate(ibn.pos, angle=rad_da)
        icp.axis = rotate(icp.axis, angle=rad_da)
        icn.axis = rotate(icn.axis, angle=rad_da)
        icp.pos = rotate(icp.pos, angle=rad_da)
        icn.pos = rotate(icn.pos, angle=rad_da)

        # -- UPDATE PROJECTION LINE -----------------------
        a_resultant = rotate(a_resultant, angle=rad_da)
        b_resultant = rotate(b_resultant, angle=rad_da)
        c_resultant = rotate(c_resultant, angle=rad_da)
        b_resultant_angle = get_angle(b_resultant)
        c_resultant_angle = get_angle(c_resultant)
        rbprojectionline.modify(0, b_resultant)
        rbprojectionline.modify(1, vector(b_resultant.x, 0, 0))
        rcprojectionline.modify(0, c_resultant)
        rcprojectionline.modify(1, vector(c_resultant.x, 0, 0))

        # -- UPDATE LABELS --------------------------------
        iaplabel.pos = rotate(iaplabel.pos, angle=rad_da)
        ianlabel.pos = rotate(ianlabel.pos, angle=rad_da)
        ibplabel.pos = rotate(ibplabel.pos, angle=rad_da)
        ibnlabel.pos = rotate(ibnlabel.pos, angle=rad_da)
        icplabel.pos = rotate(icplabel.pos, angle=rad_da)
        icnlabel.pos = rotate(icnlabel.pos, angle=rad_da)
        ialabel.pos = rotate(ialabel.pos, angle=rad_da)
        iblabel.pos = rotate(iblabel.pos, angle=rad_da)
        iclabel.pos = rotate(iclabel.pos, angle=rad_da)
        b_text = 'B = {0:4.2f} \u2220{1:-5.1f}\nB(\u03F4) = {2:7.4f}'.format(b_resultant.mag, degrees(b_resultant_angle) % 360, b_resultant.x)
        c_text = 'C = {0:4.2f} \u2220{1:-5.1f}\nC(\u03F4) = {2:7.4f}'.format(c_resultant.mag, degrees(c_resultant_angle) % 360, c_resultant.x)
        blabel.text = b_text
        clabel.text = c_text

        # -- UPDATE GRAPH --------------------------------
        ia.plot(pos=(angle, 0.05))
        ib.plot(pos=(angle, b_resultant.x))
        ic.plot(pos=(angle, c_resultant.x))
        ifault.plot(pos=(angle, -0.05))

    # -------------------------------------------------------------------------
    # --- ANIMATE SCENE5 A+B+C SEQUENCE PHASORS -------------------------------
    # -------------------------------------------------------------------------
    scene5.select()
    for angle in range(0, 720, da):
        rate(speed)

        # -- UPDATE ARROWS --------------------------------
        vap.axis = rotate(vap.axis, angle=rad_da)
        van.axis = rotate(van.axis, angle=rad_da)
        vap.pos = rotate(vap.pos,  angle=rad_da)
        van.pos = rotate(van.pos,  angle=rad_da)
        vbp.axis = rotate(vbp.axis, angle=rad_da)
        vbn.axis = rotate(vbn.axis, angle=rad_da)
        vbp.pos = rotate(vbp.pos,  angle=rad_da)
        vbn.pos = rotate(vbn.pos,  angle=rad_da)
        vcp.axis = rotate(vcp.axis, angle=rad_da)
        vcn.axis = rotate(vcn.axis, angle=rad_da)
        vcp.pos = rotate(vcp.pos,  angle=rad_da)
        vcn.pos = rotate(vcn.pos,  angle=rad_da)

        # -- UPDATE LABELS --------------------------------
        vaplabel.pos = rotate(vaplabel.pos, angle=rad_da)
        vanlabel.pos = rotate(vanlabel.pos, angle=rad_da)
        vbplabel.pos = rotate(vbplabel.pos, angle=rad_da)
        vbnlabel.pos = rotate(vbnlabel.pos, angle=rad_da)
        vcplabel.pos = rotate(vcplabel.pos, angle=rad_da)
        vcnlabel.pos = rotate(vcnlabel.pos, angle=rad_da)
        valabel.pos = rotate(valabel.pos, angle=rad_da)
        vblabel.pos = rotate(vblabel.pos, angle=rad_da)
        vclabel.pos = rotate(vclabel.pos, angle=rad_da)
        atext_ = 'Va = {0:4.2f} \u2220{1:4.1f}\nVa(\u03F4) = {2:7.4f}'.format(va_resultant.mag, degrees(va_resultant_angle) % 360, va_resultant.x)
        btext_ = 'Vb = {0:4.2f} \u2220{1:4.1f}\nVb(\u03F4) = {2:7.4f}'.format(vb_resultant.mag, degrees(vb_resultant_angle) % 360, vb_resultant.x)
        ctext_ = 'Vc = {0:4.2f} \u2220{1:4.1f}\nVc(\u03F4) = {2:7.4f}'.format(vc_resultant.mag, degrees(vc_resultant_angle) % 360, vc_resultant.x)
        alabel_.text = atext_
        blabel_.text = btext_
        clabel_.text = ctext_

        # -- UPDATE PROJECTION LINES ----------------------
        va_resultant = rotate(va_resultant, rad_da)
        vb_resultant = rotate(vb_resultant, rad_da)
        vc_resultant = rotate(vc_resultant, rad_da)
        va_resultant_angle = get_angle(va_resultant)
        vb_resultant_angle = get_angle(vb_resultant)
        vc_resultant_angle = get_angle(vc_resultant)

        vaprojectionline.modify(0, va_resultant)
        vaprojectionline.modify(1, vector(va_resultant.x, 0, 0))
        vbprojectionline.modify(0, vb_resultant)
        vbprojectionline.modify(1, vector(vb_resultant.x, 0, 0))
        vcprojectionline.modify(0, vc_resultant)
        vcprojectionline.modify(1, vector(vc_resultant.x, 0, 0))

        # -- UPDATE GRAPH ---------------------------------
        vab_resultant = va_resultant - vb_resultant
        vbc_resultant = vb_resultant - vc_resultant
        vca_resultant = vc_resultant - va_resultant
        vab.plot(pos=(angle, vab_resultant.x))
        vbc.plot(pos=(angle, vbc_resultant.x))
        vca.plot(pos=(angle, vca_resultant.x))

    scenelist = [header, scene1, scene2, scene3, scene4, scene5, graph1, graph2]
    return scenelist


# ============================================================================================================
# --------- MAIN ---------------------------------------------------------------------------------------------
# ============================================================================================================
if __name__ == '__main__':

    kvphase, positivez, negativez, zeroz = get_example()
    if next_type == 1:
        scenelist = abcg(kvphase, positivez)
    elif next_type == 2:
        scenelist = ag(kvphase, positivez, negativez, zeroz)
    elif next_type == 3:
        scenelist = bcg(kvphase, positivez, negativez, zeroz)
    elif next_type == 4:
        scenelist = bc(kvphase, positivez, negativez)
    if next_type == 0:
        scenelist[0].append_to_title('STOPPED')

    while next_type:
        r5.text = '<b>Pause  </b>'
        r5.disabled = True
        sleep(6)
        r5.disabled = False
        r5.text = '<b>Exit     </b>'
        for s in scenelist:
            s.title = ''
            s.caption = ''
            s.delete()
            scenelist = []
        kvphase, positivez, negativez, zeroz = get_example()
        if r1.checked:
            scenelist = abcg(kvphase, positivez)
        elif r2.checked:
            scenelist = ag(kvphase, positivez, negativez, zeroz)
        elif r3.checked:
            scenelist = bcg(kvphase, positivez, negativez, zeroz)
        elif r4.checked:
            scenelist = bc(kvphase, positivez, negativez)
        elif r5.checked:
            next_type = 0
        else:
            next_type = 0
