'''
BSD 3-Clause License
Copyright (c) 2019, Donald N. Bockoven III
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
'''

from __future__ import division
import matplotlib
matplotlib.use('TKAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import Tkinter as tk
from Tkinter import PhotoImage
import tkFileDialog
import tkFont
import numpy as np
from numpy.linalg import inv
from numpy import unravel_index
import scipy as sci
import scipy.integrate
import matplotlib.pyplot as plt
import os
import itertools
import math
import tkMessageBox
import time

def load_pattern(num_spans):
    test = []
    n = num_spans
    for r in range(n):
       for item in itertools.combinations(range(n), r):
           check = [1]*n
           for i in item:
               check[i] = 0
           test.append(check)
    return test
    
def align_yaxis(ax1, v1, ax2, v2):
    """adjust ax2 ylimit so that v2 in ax2 is aligned to v1 in ax1"""
    _, y1 = ax1.transData.transform((0, v1))
    _, y2 = ax2.transData.transform((0, v2))
    adjust_yaxis(ax2, (y1-y2)/2, v2)
    adjust_yaxis(ax1, (y2-y1)/2, v1)


def adjust_yaxis(ax, ydif, v):
    """shift axis ax by ydiff, maintaining point v at the same location"""
    inv = ax.transData.inverted()
    _, dy = inv.transform((0, 0)) - inv.transform((0, ydif))
    miny, maxy = ax.get_ylim()
    miny, maxy = miny - v, maxy - v
    if -miny > maxy or (-miny == maxy and dy > 0):
        nminy = miny
        nmaxy = miny*(maxy+dy)/(miny+dy)
    else:
        nmaxy = maxy
        nminy = maxy*(miny+dy)/(maxy+dy)
    ax.set_ylim(nminy+v, nmaxy+v)


def pl(p, a, l, x):
    b = l - a
    rl = (p * b) / l
    rr = (p * a) / l
    c4 = ((-rl * a ** 3) / 3) - ((rr * a ** 3) / 3) + ((rr * l * a ** 2) / 2)
    c2 = (-1 / l) * ((c4) + ((rr * l ** 3) / 3))
    c1 = ((-rr * a ** 2) / 2) - ((rl * a ** 2) / 2) + (rr * l * a) + c2
    if x <= a:
        v = rl
        m = rl * x
        eis = ((rl * x ** 2)  / 2) + c1
        eid = ((rl * x ** 3) / 6) + (c1 * x)
    else:
        v = -1 * rr
        m = (-1 * rr * x) + (rr * l)
        eis = ((-1.0 * rr * x ** 2)/2.0) + (rr * l * x) + c2
        eid = ((-rr * x ** 3) / 6) + ((rr * l * x ** 2) / 2) + (c2 * x) + c4
    return (rl, rr, v, m, eid)


def udl(W, a, b, l, x):
    c = b-a
    rl = (W * c) - (((W * c) * (a + (c / 2))) / l)
    rr = (((W * c) * (a + (c / 2))) / l)
    c1 = 0
    c2 = ((-1 * W * a ** 2) / 2)
    c3 = rr * l
    c7 = 0
    c8 = ((-1 * c1 * a ** 2) / 2) + ((c2 * a ** 2) / 2) + ((5 * W * a ** 4) / 24) + c7
    c9 = ((-1 * rl * b ** 3) / 3) - ((rr * b ** 3) / 3) + ((W * b ** 4) / 8) - ((W * a * b ** 3) / 3) - ((c2 * b ** 2) / 2) + ((c3 * b ** 2) / 2) + c8
    c6 = ((rr * l ** 2) / 6) - ((c3 * l) / 2) - (c9 / l)
    c5 = ((-1 * rl * b ** 2) / 2) + ((W * b ** 3) / 6) - ((W * a * b ** 2) / 2) - ((rr * b ** 2) / 2) + (c3 * b) - (c2 * b) + c6
    c4 = ((W * a ** 3) / 3) + (c2 * a) + c5 - (c1 * a)
    if x <= a:
        v = rl
        m = (rl * x) + c1
        eis = ((rl * x ** 2) / 2) + (c1 * x) + c4
        eid = ((rl * x ** 3) / 6) + ((c1 * x ** 2) / 2) + (c4 * x) + c7
    elif x < b:
        v = rl - (W * (x - a))
        m = (rl * x) - ((W * x ** 2) / 2) + (W * a * x) + c2
        eis = ((rl * x **2) / 2) - ((W * x ** 3) / 6) + ((W * a * x **2) / 2) + (c2 * x) + c5
        eid = ((rl * x ** 3) / 6) - ((W * x ** 4) / 24) + ((W * a * x ** 3) / 6) + ((c2 * x ** 2) / 2) + (c5 * x) + c8
    else:
        v = -rr
        m = (-1 * rr * x) + c3
        eis = ((-1 * rr * x ** 2) / 2) + (c3 * x) + c6
        eid = ((-1 * rr * x ** 3) / 6) + ((c3 * x ** 2) / 2) + (c6 * x) + c9
    return (rl, rr, v, m, eid)


def trapl(w1, w2, a, b, l, x):
    d = b-a
    s = (w2 - w1) / d
    if w2 == -1*w1:
        xbar = d/2
    else:
        xbar = (d * ((2 * w2) + w1)) / (3 * (w2 + w1))
    W = d * ((w1 + w2) / 2)
    rr = (W * (a + xbar)) / l
    rl = W - rr
    c1 = 0
    c2 = c1 + ((a ** 3 * s) / 6) + ((a ** 2 * (w1 - (s * a))) / 2) + ((((s * a) - (2 * w1)) * a ** 2) / 2)
    c3 = rr * l
    c7 = 0
    c8 = ((-1 * c1 * a ** 2) / 2) - ((a ** 5 * s) / 30) - ((a ** 4 * (w1 - (s * a))) / 8) - ((((s * a) - (2 * w1)) * a ** 4) / 6) + ((c2 * a ** 2) / 2) + c7
    c9 = ((-1 * rl * b ** 3) / 3) + ((b ** 5 * s) / 30) + ((b ** 4 * (w1 - (s * a))) / 8) + ((((s * a) - (2 * w1)) * a * b ** 3) / 6) - ((c2 * b ** 2) / 2) + c8 - ((rr * b ** 3) / 3) + ((c3 * b ** 2) / 2)
    c6 = (((rr * l ** 3) / 6) - ((c3 * l ** 2) / 2) - c9) / l
    c5 = ((-1 * rr * b ** 2) / 2) + (c3 * b) + c6 - ((rl * b ** 2) / 2) + ((b ** 4 * s) / 24) + ((b ** 3 * (w1 - (s * a))) / 6) + ((((s * a) - (2 * w1)) * a * b ** 2) / 4) - (c2 * b)
    c4 = ((-1 * a ** 4 * s) / 24) - ((a ** 3 * (w1 - (s * a))) / 6) - ((((s * a) - (2 * w1)) * a ** 3) / 4) + (c2 * a) + c5 - (c1 * a)
    if x <= a:
        v = rl
        m = (rl * x) + c1
        eis = ((rl * x ** 2) / 2) + (c1 * x) + c4
        eid = ((rl * x ** 3) / 6) + ((c1 * x ** 2) / 2) + (c4 * x) + c7
    elif x < b:
        v = rl - ((x ** 2 * s) / 2) - (x * (w1 - (s * a))) - ((((s * a) - (2 * w1)) * a) / 2)
        m = (rl * x) - ((x ** 3 * s) / 6) - ((x ** 2 * (w1 - (s * a))) / 2) - ((((s * a) - (2 * w1)) * a * x) / 2) + c2
        eis = ((rl * x ** 2) / 2) - ((x ** 4 * s) / 24) - ((x ** 3 * (w1 - (s * a))) / 6) - ((((s * a) - (2 * w1)) * a * x ** 2) / 4) + (c2 * x) + c5
        eid = ((rl * x ** 3) / 6) - ((x ** 5 * s) / 120) - ((x ** 4 * (w1 - (s * a))) / 24) - ((((s * a) - (2 * w1)) * a * x ** 3) / 12) + ((c2 * x ** 2) / 2) + (c5 * x) + c8
    else:
        v = -1 * rr
        m = (-1 * rr * x) + c3
        eis = ((-1 * rr * x ** 2) / 2) + (c3 * x) + c6
        eid = ((-1 * rr * x ** 3) / 6) + ((c3 * x ** 2) / 2) + (c6 * x) + c9
    return (rl, rr, v, m, eid)


def cant_right_point(p, a, l, x):
    rl = p
    ml = -1*p*a
    if x <= a:
        v = p
        m = rl*x + ml
    if x > a:
        v = 0
        m = 0
    return(rl, ml, v, m)


def cant_right_udl(w, a, b, l, x):
    c = b-a
    w_tot = w*c
    rl = w_tot
    ml = -1*w_tot*(a + (c/2))
    if x <= a:
        v = w_tot
        m = rl*x + ml
    elif x <= b:
        v = w_tot - w*(x-a)
        m = rl*x + ml - (w*(x-a)*((x-a)/2))
    else:
        v = 0
        m = 0
    return(rl, ml, v, m)


def cant_left_point(p, a, l, x):
    rr = p
    mr = -1*p*(l-a)
    if x < a:
        v = 0
        m = 0
    if x >= a:
        v = -1*rr
        m = -1*rr*(x-a)
    return(rr, mr, v, m)


def cant_left_udl(w, a, b, l, x):
    c = b-a
    w_tot = w*c
    rr = w_tot
    mr = -1*w_tot*(l-b+(c/2))
    if x <= a:
        v = 0
        m = 0
    elif a < x <= b:
        v = -1*w*(x-a)
        m = -1*(w*(x-a)*((x-a)/2))
    else:
        v = -1*w_tot
        m = -1*w_tot*(x-b+(c/2))
    return(rr, mr, v, m)


def cant_right_trap(w1, w2, a, b, l, x):
    c = b-a
    w = 0.5*(w1+w2)*c
    d = a+(((w1+(2*w2))/(3*(w2+w1)))*c)
    s = (w1-w2)/c
    rl = w
    ml = -1*w*d
    if x <= a:
        v = w
        m = (w*x)+ml
    elif a < x < b:
        cx = x-a
        wx = w1-(s*cx)
        dx = x - (a+(((w1+(2*wx))/(3*(wx+w1)))*cx))
        wwx = 0.5*(w1+wx)*cx
        v = w-wwx
        m = (w*x+ml)-(wwx*dx)
    else:
        v = 0
        m = 0
    return(rl, ml, v, m)


def cant_left_trap(w1, w2, a, b, l, x):
    c = b-a
    w = 0.5*(w1+w2)*c
    dl = a+(((w1+(2*w2))/(3*(w2+w1)))*c)
    dr = l-dl
    s = (w1-w2)/c
    rr = w
    mr = -1*w*dr
    if x <= a:
        v = 0
        m = 0
    elif a < x < b:
        cx = x-a
        wx = w1-(s*cx)
        dlx = a+(((w1+(2*wx))/(3*(wx+w1)))*cx)
        drx = x-dlx
        wwx = 0.5*(w1+wx)*cx
        v = (-0.5*((2*w1)-(s*(x-a))))*(x-a)
        m = -1*wwx*drx
    else:
        v = -1*w
        m = -1*w*(x-dl)
    return(rr, mr, v, m)


def three_moment_method(beam_spans, beam_momentofinertia, cant, beam_loads_raw, E, iters, displace):
    N = len(beam_spans)                       # number of spans

    sumL = np.cumsum(beam_spans)              # cumulative sum of beam lengths
    sumL = sumL.tolist()

    xs = np.zeros((iters+1, N))
    j = 0
    for j in range(0, N):
        xs[0, j] = 0
        xs[iters, j] = beam_spans[j]
        i = 0
        for i in range(1, iters):
            xs[i, j] = xs[i-1, j] + beam_spans[j]/iters
    v_diag = np.zeros((iters+1, N))
    v_diag_cantL = np.zeros((iters+1, N))
    v_diag_cantR = np.zeros((iters+1, N))
    m_diag = np.zeros((iters+1, N))
    m_diag_cantL = np.zeros((iters+1, N))
    m_diag_cantR = np.zeros((iters+1, N))
    s_diag = np.zeros((iters+1, N))
    d_diag = np.zeros((iters+1, N))
    r_span = np.zeros((2, N))

    # Span as simple support Moment, Shears, and Reactions
    j = 0
    for j in range(0, N):
        i = 0
        for i in range(0, iters+1):
            for load in beam_loads_raw:
                if load[5] == j:
                    if load[4] == "POINT":
                        rl, rr, v, m, d = pl(load[0], load[2], beam_spans[j], xs[i, j])
                        v_diag[i, j] = v_diag[i, j]+v
                        m_diag[i, j] = m_diag[i, j]+m

                    elif load[4] == "UDL":
                        rl, rr, v, m, d = udl(load[0], load[2], load[3], beam_spans[j], xs[i, j])
                        v_diag[i, j] = v_diag[i, j]+v
                        m_diag[i, j] = m_diag[i, j]+m

                    elif load[4] == "TRAP":
                        rl, rr, v, m, d = trapl(load[0], load[1], load[2], load[3], beam_spans[j], xs[i, j])
                        v_diag[i, j] = v_diag[i, j]+v
                        m_diag[i, j] = m_diag[i, j]+m

                    else:
                        pass
                else:
                    pass

    for j in range(0, N):
        for load in beam_loads_raw:
            if load[5] == j:
                if load[4] == "POINT":
                    rl, rr, v, m, d = pl(load[0], load[2], beam_spans[j], xs[0, j])
                    r_span[0, j] = r_span[0, j]+rl
                    r_span[1, j] = r_span[1, j]+rr
                elif load[4] == "UDL":
                    rl, rr, v, m, d = udl(load[0], load[2], load[3], beam_spans[j], xs[0, j])
                    r_span[0, j] = r_span[0, j]+rl
                    r_span[1, j] = r_span[1, j]+rr
                elif load[4] == "TRAP":
                    rl, rr, v, m, d = trapl(load[0], load[1], load[2], load[3], beam_spans[j], xs[0, j])
                    r_span[0, j] = r_span[0, j]+rl
                    r_span[1, j] = r_span[1, j]+rr
                else:
                    pass
            else:
                pass

    # Horizontal center of moment region
    j = 0
    a_xl_xr = np.zeros((3, N))
    m_xx = np.zeros((iters+1, N))
    for j in range(0, N):

        m_xx[:, j] = m_diag[:, j]*xs[:, j]
        A = sci.integrate.simps(m_diag[:, j], xs[:, j])
        a_xl_xr[0, j] = A
        if A == 0:
            a_xl_xr[1, j] = 0
            a_xl_xr[2, j] = 0
        else:
            xl = (1/A)*sci.integrate.simps(m_xx[:, j], xs[:, j])
            a_xl_xr[1, j] = xl
            a_xl_xr[2, j] = beam_spans[j] - xl

    # Cantilever Moments, Shears, and reactions
    mr_cant = 0
    ml_cant = 0
    rr_cant = 0
    rl_cant = 0
    if cant[0] == 'L' or cant[0] == 'B':
        for i in range(0, iters+1):
            for load in beam_loads_raw:
                    if load[5] == 0:
                        if load[4] == "POINT":
                            rr, mr, v, m = cant_left_point(load[0], load[2], beam_spans[0], xs[i, 0])
                            v_diag_cantL[i, 0] = v_diag_cantL[i, 0]+v
                            m_diag_cantL[i, 0] = m_diag_cantL[i, 0]+m

                        elif load[4] == "UDL":
                            rr, mr, v, m = cant_left_udl(load[0], load[2], load[3], beam_spans[0], xs[i, 0])
                            v_diag_cantL[i, 0] = v_diag_cantL[i, 0]+v
                            m_diag_cantL[i, 0] = m_diag_cantL[i, 0]+m

                        elif load[4] == "TRAP":
                            rr, mr, v, m = cant_left_trap(load[0], load[1], load[2], load[3], beam_spans[0], xs[i, 0])
                            v_diag_cantL[i, 0] = v_diag_cantL[i, 0]+v
                            m_diag_cantL[i, 0] = m_diag_cantL[i, 0]+m

                        else:
                            pass
        for load in beam_loads_raw:
            if load[5] == 0:
                if load[4] == "POINT":
                    rr, mr, v, m = cant_left_point(load[0], load[2], beam_spans[0], xs[i, 0])

                    rr_cant = rr_cant+rr
                    mr_cant = mr_cant+mr

                elif load[4] == "UDL":
                    rr, mr, v, m = cant_left_udl(load[0], load[2], load[3], beam_spans[0], xs[i, 0])

                    rr_cant = rr_cant+rr
                    mr_cant = mr_cant+mr

                elif load[4] == "TRAP":
                    rr, mr, v, m = cant_left_trap(load[0], load[1], load[2], load[3], beam_spans[0], xs[i, 0])

                    rr_cant = rr_cant+rr
                    mr_cant = mr_cant+mr

                else:
                    pass

    else:
        pass

    if cant[0] == 'R' or cant[0] == 'B':
        v_diag[:, N-1] = 0
        m_diag[:, N-1] = 0
        for i in range(0, iters+1):
            for load in beam_loads_raw:
                    if load[5] == N-1:
                        if load[4] == "POINT":
                            rl, ml, v, m = cant_right_point(load[0], load[2], beam_spans[N-1], xs[i, N-1])
                            v_diag_cantR[i, N-1] = v_diag_cantR[i, N-1]+v
                            m_diag_cantR[i, N-1] = m_diag_cantR[i, N-1]+m

                        elif load[4] == "UDL":
                            rl, ml, v, m = cant_right_udl(load[0], load[2], load[3], beam_spans[N-1], xs[i, N-1])
                            v_diag_cantR[i, N-1] = v_diag_cantR[i, N-1]+v
                            m_diag_cantR[i, N-1] = m_diag_cantR[i, N-1]+m

                        elif load[4] == "TRAP":
                            rl, ml, v, m = cant_right_trap(load[0], load[1], load[2], load[3], beam_spans[N-1], xs[i, N-1])
                            v_diag_cantR[i, N-1] = v_diag_cantR[i, N-1]+v
                            m_diag_cantR[i, N-1] = m_diag_cantR[i, N-1]+m

                        else:
                            pass

        for load in beam_loads_raw:
            if load[5] == N-1:
                if load[4]=="POINT":
                    rl,ml,v,m = cant_right_point(load[0],load[2],beam_spans[N-1],xs[i,N-1])
                    rl_cant = rl_cant+rl
                    ml_cant = ml_cant+ml

                elif load[4]=="UDL":
                    rl,ml,v,m = cant_right_udl(load[0],load[2],load[3],beam_spans[N-1],xs[i,N-1])
                    rl_cant=rl_cant+rl
                    ml_cant = ml_cant+ml

                elif load[4]=="TRAP":
                    rl,ml,v,m = cant_right_trap(load[0],load[1],load[2],load[3],beam_spans[N-1],xs[i,N-1])
                    rl_cant=rl_cant+rl
                    ml_cant = ml_cant+ml

                else:
                    pass

    else:
        pass


    F = np.zeros((N+1,N+1))
    j=0
    for j in range(1,N):
        F[j,j-1] = beam_spans[j-1]/beam_momentofinertia[j-1]
        F[j,j] = 2*((beam_spans[j-1]/beam_momentofinertia[j-1])+(beam_spans[j]/beam_momentofinertia[j]))
        F[j,j+1] = beam_spans[j]/beam_momentofinertia[j]

    if cant[0]=='L':

        F[0,0] = 1
        F[1,:] = 0
        F[1,1] = 1
        F[N,N] = 1

    elif cant[0]=='R':
        F[0,0] = 1
        F[N,N] = 1
        F[N-1,:] = 0
        F[N-1,N-1] = 1

    elif cant[0]=='B':
        F[0,0] = 1
        F[1,:] = 0
        F[1,1] = 1
        F[N,N] = 1
        F[N-1,:] = 0
        F[N-1,N-1] = 1

    else:
        F[0,0] = 1
        F[N,N] = 1

    delta = np.zeros((N+1,1))
    j=0
    for j in range(1,N): 

        l = j-1
        r = j
        #support settlement delta
        delta[j] = ((-6*a_xl_xr[1,l]*a_xl_xr[0,l])/(beam_spans[l]*beam_momentofinertia[l])+(-6*a_xl_xr[2,r]*a_xl_xr[0,r])/(beam_spans[r]*beam_momentofinertia[r]))+(6*E*(((displace[l]-displace[r])/beam_spans[l])+((displace[r+1]-displace[r])/beam_spans[r])))
        #delta[j] = (-6*a_xl_xr[1,l]*a_xl_xr[0,l])/(beam_spans[l]*beam_momentofinertia[l])+(-6*a_xl_xr[2,r]*a_xl_xr[0,r])/(beam_spans[r]*beam_momentofinertia[r])

    if cant[0]=='L':

        delta[0] = 0
        delta[1] = mr_cant

    elif cant[0]=='R':
        delta[N]=0
        delta[N-1]=ml_cant

    elif cant[0]=='B':
        delta[0] = 0
        delta[1] = mr_cant
        delta[N]=0
        delta[N-1]=ml_cant

    else:
        pass
    #print F
    #print delta
    M = np.dot(inv(F),delta)

    R = np.zeros((N+1,1))
    j=0
    for j in range(0,N+1):

        l = j-1
        r = j

        if j == 0:
            R[j] = (r_span[0,r]) - (M[j]/beam_spans[r]) + (M[j+1]/beam_spans[r])

        elif j == N:
            R[j] = (r_span[1,l]) - (M[j]/beam_spans[l]) + (M[j-1]/beam_spans[l])

        elif j > 0 and j < N:
            R[j] = (r_span[0,r]+r_span[1,l]) - (M[j]/beam_spans[r]) - (M[j]/beam_spans[l])  + (M[j+1]/beam_spans[r]) + (M[j-1]/beam_spans[l])
        else:
            pass

    slope = np.zeros((N,1))
    j=0
    for j in range(0,N):
        r = j

        slope[j] = ((a_xl_xr[2,r]*a_xl_xr[0,r])/beam_spans[r])+((M[j+1]*beam_spans[r])/6)+((M[j]*beam_spans[r])/3)

        slope[j] = -1*slope[j] / (E*beam_momentofinertia[r])

    #Cantilever Slope Corrections
    if cant[0]=='R' or cant[0] =='B':
        slope[N-1] =  ((a_xl_xr[1,N-2]*a_xl_xr[0,N-2])/beam_spans[N-2])+((M[N-2]*beam_spans[N-2])/6)+((M[N-1]*beam_spans[N-2])/3)
        slope[N-1] = slope[N-1] / (E*beam_momentofinertia[N-2])

    else:
        pass

    j=0
    for j in range(0,N):
        v_diag[:,j] = (-1*v_diag[:,j]) + ((M[j]-M[j+1])/beam_spans[j])
        #m_diag[:,j] = M[j,0] + sci.integrate.cumtrapz(-1*v_diag[:,j],xs[:,j], initial = 0)
        x=0
        for x in range(0,iters+1):
            m_diag[x,j] = m_diag[x,j]-(((M[j]-M[j+1])/beam_spans[j])*xs[x,j])+M[j]
        s_diag[:,j] = (sci.integrate.cumtrapz(m_diag[:,j],xs[:,j], initial = 0)/(E*beam_momentofinertia[j]))+slope[j,0]
        d_diag[:,j] = sci.integrate.cumtrapz(s_diag[:,j],xs[:,j], initial = 0)
        
        
    #correct d for support displacement
    for j in range(0,N):
        span = beam_spans[j]
        
        #test slope correction
        slope_i = math.atan(-1.0*(displace[j]-displace[j+1])/span)
        s_diag[:,j] = s_diag[:,j] + slope_i
        #slope_i = 0
        
        for i in range(0,len(xs[:,j])):
            delt_i = displace[j] + (((displace[j+1]-displace[j])/span)*xs[i,j])
            d_diag[i,j] = d_diag[i,j] + delt_i

    #Cantilever Diagram Corrections
    if cant[0]=='L' or cant[0] =='B':
        v_diag[:,0] = -1*v_diag_cantL[:,0]
        m_diag[:,0] = m_diag_cantL[:,0]
        s_diag[:,0] = (sci.integrate.cumtrapz(m_diag[::-1,0],xs[:,0], initial = 0)/(E*beam_momentofinertia[0]))-s_diag[0,1]
        d_diag[:,0] = sci.integrate.cumtrapz(s_diag[:,0],xs[:,0], initial = 0)
        s_diag[:,0] = -1*s_diag[::-1,0]
        d_diag[:,0] = d_diag[::-1,0]

    else:
        pass

    if cant[0]=='R' or cant[0] =='B':
        v_diag[:,N-1] = -1*v_diag_cantR[:,N-1]
        m_diag[:,N-1] = m_diag_cantR[:,N-1]
        s_diag[:,N-1] = (sci.integrate.cumtrapz(m_diag[:,N-1],xs[:,N-1], initial = 0)/(E*beam_momentofinertia[N-1]))+s_diag[-1,N-2]
        d_diag[:,N-1] = sci.integrate.cumtrapz(s_diag[:,N-1],xs[:,N-1], initial = 0)

    else:
        pass
    
    #Below not needed with slope correction above for support displacement
    ''''
    #correct cantilever d for support displacement
    if cant[0]=='L' or cant[0] =='B':
        if displace[2] == 0 and displace[1] == 0:
            pass
        else:        
            span_cant = beam_spans[0]
            span_int = beam_spans[1]
            for i in range(0,len(xs[:,0])):
                if displace[2] == 0 or displace[2]==displace[1]:
                    simt = displace[1]/span_int
                    if displace[2]==displace[1]:
                        delt_i = displace[1]
                    else:
                        delt_i = ((span_cant-xs[i,0])+span_int) * simt

                    d_diag[i,0]= d_diag[i,0]+ delt_i
                else:
                    xl= (displace[2]/((displace[2]-displace[1])/span_int))
                    xr= span_int - xl
                    delt_i= -1*((span_cant-xs[i,0])+xr) * (displace[2]/xl)
                    d_diag[i,0]= d_diag[i,0]+ delt_i

    if cant[0]=='R' or cant[0] =='B':
        if displace[N-2] == 0 and displace[N-1] == 0:
            pass
        else: 
            span_cant= beam_spans[N-1]
            span_int= beam_spans[N-2]
            for i in range(0,len(xs[:,0])):
                if displace[N-2] == 0 or displace[N-2] == displace[N-1]:
                    simt = displace[N-1]/span_int
                    if displace[N-2] == displace[N-1]:
                        delt_i = displace[N-1]
                    else:
                        delt_i = (xs[i,0]+span_int) * simt
                    d_diag[i,N-1]= d_diag[i,N-1] + delt_i
                else:
                    xl= displace[N-2]/((displace[N-2]-displace[N-1])/span_int)
                    xr= span_int - xl
                    delt_i= -1*(xs[i,N-1] + xr)* (displace[N-2]/xl)
                    d_diag[i,N-1]= d_diag[i,N-1] + delt_i
    '''

    #correct cantilever d for support displacement

    if cant[0]=='L' or cant[0] =='B':
        if displace[2] == 0 and displace[1] == 0:
            pass
        else:        
            d_diag[:,0] = d_diag[:,0]+displace[1]


    if cant[0]=='R' or cant[0] =='B':
        if displace[N-2] == 0 and displace[N-1] == 0:
            pass
        else: 
           d_diag[:,-1] = d_diag[:,-1]+displace[-2] 	 
 
    j=0
    for j in range(1,N):
        xs[:,j] = xs[:,j] + sumL[j-1]

    xs = xs/12
    for j in range(0,N):
        v_diag[:,j] = -1*v_diag[:,j]/1000
        m_diag[:,j] = m_diag[:,j]/(12*1000)

    return(xs,v_diag,m_diag,s_diag,d_diag, R, M)


def path_exists(path):
    res_folder_exist = os.path.isdir(path)

    if res_folder_exist is False:

        os.makedirs(path)

    else:
        pass

    return 'Directory created'

class Results_window():
    def __init__(self, master):

        self.master = master
        self.pattern_index = 0
        self.combo_index = 0
        self.customfont = tkFont.Font(family="Helvetica", size=8)
        ## Main Frame
        self.main_frame = tk.Frame(self.master, bd=2, relief='sunken', padx=5,pady=5)
        self.main_frame.pack(anchor=tk.CENTER, padx= 10, pady= 5, fill=tk.BOTH)

        ## results selection Frame
        self.frame_selection = tk.Frame(self.main_frame, padx=5, pady=5)

        self.type_frame_select = tk.Frame(self.frame_selection, padx=1, pady=1)

        self.combo_type = tk.IntVar()
        self.base_type = tk.Radiobutton(self.type_frame_select, text = "Base Loads", variable=self.combo_type, value=1, command=self.base).pack(side=tk.LEFT, anchor=tk.NW, padx= 5, pady= 1)
        self.asd_type = tk.Radiobutton(self.type_frame_select, text = "ASD/Basic", variable=self.combo_type, value=2, command=self.asd).pack(side=tk.LEFT, anchor=tk.NW, padx= 5, pady= 1)
        self.lrfd_type = tk.Radiobutton(self.type_frame_select, text = "LRFD", variable=self.combo_type, value=3, command= self.lrfd).pack(side=tk.LEFT, anchor=tk.NW, padx= 5, pady= 1)
        self.combo_type.set(1)
        self.type_frame_select.pack(side=tk.TOP, anchor=tk.NW, fill=tk.BOTH)
        
        self.combo_pattern_frame = tk.Frame(self.frame_selection)
        self.combo_frame = tk.LabelFrame(self.combo_pattern_frame, text='Combo', relief='sunken', padx=5, pady=5)

        self.asd_combos = Main_window.basic_combos
        self.lrfd_combos = Main_window.lrfd_combos
        self.load_types = ['D', 'Ex', 'Ey', 'F', 'H', 'L', 'Lr', 'R', 'S', 'Wx', 'Wy']
        self.combo_list = tk.Listbox(self.combo_frame, height = 25, width = 50, exportselection=False)
        self.combo_list.pack(side=tk.LEFT)
        self.combo_list.bind("<<ListboxSelect>>",self.combo_click)
        for i in range(len(self.load_types)):
            if Main_window.load_exist[i]==0:
                self.combo_list.insert(tk.END, self.load_types[i]+'- N/A')
            else:
                self.combo_list.insert(tk.END, self.load_types[i])
        self.combo_list.insert(tk.END, 'Support Displacement')
        self.combo_string = 'D'
        self.combo_scrollbar = tk.Scrollbar(self.combo_frame, orient="vertical")
        self.combo_list.config(yscrollcommand=self.combo_scrollbar.set)
        self.combo_scrollbar.config(command=self.combo_list.yview)
        self.combo_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.combo_frame.pack(side=tk.LEFT)
        self.pattern_frame = tk.LabelFrame(self.combo_pattern_frame, text='Load Pattern', relief='sunken', padx=5, pady=5)
        self.pattern_list = tk.Listbox(self.pattern_frame, height = 25, width = 20, exportselection=False)
        self.pattern_list.pack(side = tk.LEFT)
        self.pattern_list.bind("<<ListboxSelect>>",self.pattern_click)
        i=1        
        for pattern in Main_window.pats:
            pat_string = 'Pattern ' + str(i) +' - '
            for y in pattern:
                pat_string = pat_string + str(y) + ','
            pat_string = pat_string[:-1]
            self.pattern_list.insert(tk.END, pat_string)
            i+=1
        self.pattern_list.insert(tk.END, 'Envelope')
        self.pattern_scrollbar = tk.Scrollbar(self.pattern_frame, orient="vertical")
        self.pattern_list.config(yscrollcommand=self.pattern_scrollbar.set)
        self.pattern_scrollbar.config(command=self.pattern_list.yview)
        self.pattern_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.pattern_frame.pack(side = tk.LEFT)
        self.combo_pattern_frame.pack(side = tk.TOP)
        
        self.per_span_res_frame = tk.Frame(self.frame_selection,relief='sunken')
        stations = Main_window.stations
        print stations
        self.span_res_scale = tk.Scale(self.per_span_res_frame, from_=0, to=stations, orient=tk.HORIZONTAL, label = "Location in Span:", length = 300, command=self.span_res_run)
        self.span_res_scale.pack(side=tk.TOP, padx=5, pady=5)
        self.span_res_b_plus = tk.Button(self.per_span_res_frame,text='+', command = self.set_span_res_plus)
        self.span_res_b_plus.pack(side=tk.RIGHT)
        self.span_res_b_minus = tk.Button(self.per_span_res_frame,text='-', command = self.set_span_res_minus)
        self.span_res_b_minus.pack(side=tk.RIGHT)
        self.span_res_label = tk.Label(self.per_span_res_frame, text="per span results here")
        self.span_res_label.pack(side=tk.TOP)
        self.per_span_res_frame.pack(side = tk.TOP)
        
        self.frame_selection.pack(side=tk.LEFT, fill=tk.BOTH)

        ## Chart Frame and selection frames
        self.selection_frame = tk.Frame(self.main_frame, padx=5, pady=5)
        self.res_reaction_frame = tk.Frame(self.selection_frame, padx=5, pady=5)
        self.res_combo = tk.Label(self.res_reaction_frame, text="")
        self.res_combo.pack(side=tk.TOP)
        self.res_R = tk.Label(self.res_reaction_frame, text="")
        self.res_R.pack(side=tk.TOP)
        self.res_M = tk.Label(self.res_reaction_frame, text="")
        self.res_M.pack(side=tk.TOP)
        self.res_reaction_frame.pack(side=tk.TOP)
        self.vmsd_frame = tk.Frame(self.selection_frame, padx=5, pady=5)
        self.vmsd = tk.IntVar()
        self.v = tk.Radiobutton(self.vmsd_frame, text = 'V', variable=self.vmsd, value=1, command= self.vrun)
        self.v.pack(side=tk.LEFT)
        self.m = tk.Radiobutton(self.vmsd_frame, text = 'M', variable=self.vmsd, value=2, command= self.mrun)
        self.m.pack(side=tk.LEFT)
        self.s = tk.Radiobutton(self.vmsd_frame, text = 'S', variable=self.vmsd, value=3, command= self.srun)
        self.s.pack(side=tk.LEFT)
        self.d = tk.Radiobutton(self.vmsd_frame, text = 'D', variable=self.vmsd, value=4, command= self.drun)
        self.d.pack(side=tk.LEFT)
        self.vmsd.set(1)
        self.res_min_max = tk.Label(self.vmsd_frame, text="", justify=tk.LEFT)
        self.res_min_max.pack(side=tk.LEFT)
        self.vmsd_frame.pack(side=tk.TOP)
        self.chart_frame = tk.Frame(self.selection_frame, padx=5, pady=5)

        self.Fig = matplotlib.figure.Figure(figsize=(9,5),dpi=100)
        self.FigSubPlot = self.Fig.add_subplot(111)
        self.FigSubPlot.minorticks_on()
        self.FigSubPlot.grid(b=True, which='major', color='k', linestyle='-', alpha=0.3)
        self.FigSubPlot.grid(b=True, which='minor', color='g', linestyle='-', alpha=0.1)

        self.linevmsd = []
        self.lineenvmin = []
        self.linebm = []
        self.clabels = []
        self.clabels_pts = []
        self.x = 0
        self.y = 0
        self.ymax = 0
        for i in range(Main_window.xs.shape[1]):
            self.linebm.append(self.FigSubPlot.plot(Main_window.xs[:,i],Main_window.bm[:,i]))
            self.linevmsd.append(self.FigSubPlot.plot(Main_window.xs[:,i],Main_window.bm[:,i]))
            self.lineenvmin.append(self.FigSubPlot.plot(Main_window.xs[:,i],Main_window.bm[:,i]))
        self.res_points = self.FigSubPlot.plot(0,0,'k+', markersize=15)
        self.canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(self.Fig, master=self.chart_frame)
        self.canvas.show()
        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)

        self.toolbar = NavigationToolbar2TkAgg(self.canvas, self.chart_frame)
        self.toolbar.update()
        self.canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)

        self.chart_frame.pack(side=tk.TOP, fill=tk.BOTH)
        self.selection_frame.pack(side=tk.LEFT, fill=tk.BOTH)

        ## Outside Main Frame
        self.b1 = tk.Button(self.master,text="Close", command=self.close_win)
        self.b1.pack(side=tk.RIGHT, anchor=tk.SW, padx=5, pady=5)
        self.annos_scale = tk.Scale(self.master, from_=3, to=30, orient=tk.HORIZONTAL, label = "Graph Annotations:", length = 200)
        self.annos_scale.pack(side=tk.RIGHT, anchor=tk.SW, padx=5, pady=5)
        
        self.sup_disp_var = tk.IntVar()
        self.ch_sup_disp = tk.Checkbutton(self.master, text=": Remove Support Displacement\nResponse", justify=tk.LEFT, variable=self.sup_disp_var, command=self.sup_disp_click)
        self.ch_sup_disp.pack(side=tk.RIGHT, anchor=tk.SW, padx=5, pady=5)        

        self.label_error = tk.Label(self.master, text='Error Info')
        self.label_error.pack(side=tk.LEFT, anchor=tk.SE, padx=5, pady=5)

    def combo_click(self, *event):
        self.combo_index = self.combo_list.curselection()
        self.combo_index = self.combo_index[0]
        self.combo_string = self.combo_list.get(self.combo_index)
        # self.pattern_index = self.pattern_list.curselection()
        # self.pattern_index = self.pattern_index[0]
        self.pattern_index = 0
        self.pattern_string = self.pattern_list.get(self.pattern_index)
        self.graph_start()
        dia = self.vmsd.get()
        self.graph_start()
        if dia == 1:
            self.vrun()
        elif dia == 2:
            self.mrun()
        elif dia == 3:
            self.srun()
        elif dia == 4:
            self.drun()
        else:
            pass

    def pattern_click(self, *event):
        self.pattern_index = self.pattern_list.curselection()
        self.pattern_index = self.pattern_index[0]
        self.pattern_string = self.pattern_list.get(self.pattern_index)
        dia = self.vmsd.get()
        self.graph_start()
        if dia == 1:
            self.vrun()
        elif dia == 2:
            self.mrun()
        elif dia == 3:
            self.srun()
        elif dia == 4:
            self.drun()
        else:
            pass
            
    def sup_disp_click(self, *event):
        dia = self.vmsd.get()
        self.graph_start()
        if dia == 1:
            self.vrun()
        elif dia == 2:
            self.mrun()
        elif dia == 3:
            self.srun()
        elif dia == 4:
            self.drun()
        else:
            pass              

    def asd(self):
        self.combo_list.delete(0,tk.END)
        for i in range(0,len(self.asd_combos)):
            combo = self.asd_combos[i] + ' - '
            for y in range(0,len(self.load_types)):
                if Main_window.basic_factors[i][y] == 0.0 or Main_window.load_exist[y]==0:
                    pass
                else:        
                    combo = combo + ' {0:.2f}*{1} +'.format(Main_window.basic_factors[i][y],self.load_types[y])
            self.combo_list.insert(tk.END, combo[:-1])
        self.combo_list.insert(tk.END, 'ASD/Basic Envelope')
        self.s.config(state='normal')
        self.d.config(state='normal')
        self.combo_list.selection_set(0)
        self.pattern_list.selection_set(0)

    def lrfd(self):
        self.combo_list.delete(0,tk.END)
        for i in range(0,len(self.lrfd_combos)):
            combo = self.lrfd_combos[i] + ' - '
            for y in range(0,len(self.load_types)):
                if Main_window.LRFD_factors[i][y] == 0.0 or Main_window.load_exist[y]==0:
                    pass
                else:
                    combo = combo + ' {0:.2f}*{1} +'.format(Main_window.LRFD_factors[i][y],self.load_types[y])
            self.combo_list.insert(tk.END, combo[:-1])
        self.combo_list.insert(tk.END, 'LRFD Envelope')
        self.s.config(state='disabled')
        self.d.config(state='disabled')
        self.combo_list.selection_set(0)
        self.pattern_list.selection_set(0)

    def base(self):
        self.combo_list.delete(0,tk.END)
        for i in range(len(self.load_types)):
            if Main_window.load_exist[i]==0:
                self.combo_list.insert(tk.END, self.load_types[i]+'- N/A')
            else:
                self.combo_list.insert(tk.END, self.load_types[i])
        self.combo_list.insert(tk.END, 'Support Displacement')
        self.s.config(state='normal')
        self.d.config(state='normal')
        self.combo_list.selection_set(0)
        self.pattern_list.selection_set(0)
 
    def save_graph(self):
        self.Fig.savefig(self.path, dpi=150)

    def close_win(self):
        self.master.destroy()

    def graph_start(self, *event):

        combo = self.combo_type.get()
        R= 0
        M= 0
        Rmin= []
        Mmin= []
        #Main_window.LRFD_factors
        #Main_window.lrfd_combos
        #Main_window.basic_factors
        #Main_window.basic_combos

        if combo == 2:
            asd_combo = self.combo_index
            if asd_combo in range(0, len(self.asd_combos)):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    R = Main_window.basic_r[asd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                    M = Main_window.basic_m_support[asd_combo][1][self.pattern_index] - (self.sup_disp_var.get()* Main_window.displace_initial_results[5])
                else:
                    R = Main_window.basic_r_env_max[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                    M = Main_window.basic_m_support_env_max[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])
                    Rmin = Main_window.basic_r_env_min[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                    Mmin = Main_window.basic_m_support_env_min[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])
            else:
                R = Main_window.asd_Rmax_print - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                M = Main_window.asd_Mmax_print - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])
                Rmin = Main_window.asd_Rmin_print - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                Mmin = Main_window.asd_Mmin_print - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])

        elif combo == 3:
            lrfd_combo = self.combo_index
            if lrfd_combo in range(0,len(self.lrfd_combos)):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    R = Main_window.lrfd_r[lrfd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                    M = Main_window.lrfd_m_support[lrfd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])
                else:
                    R = Main_window.lrfd_r_env_max[lrfd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                    M = Main_window.lrfd_m_support_env_max[lrfd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])
                    Rmin = Main_window.lrfd_r_env_min[lrfd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                    Mmin = Main_window.lrfd_m_support_env_min[lrfd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])
            else:
                R = Main_window.lrfd_Rmax_print - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                M = Main_window.lrfd_Mmax_print - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])
                Rmin = Main_window.lrfd_Rmin_print - (self.sup_disp_var.get() * Main_window.displace_initial_results[4])
                Mmin = Main_window.lrfd_Mmin_print - (self.sup_disp_var.get() * Main_window.displace_initial_results[5])

        elif combo == 1:
            basic_combo = self.combo_index
            if basic_combo in range(5,9):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    R = Main_window.load_results[basic_combo][6][1][self.pattern_index]+ Main_window.load_results[basic_combo][6][0]
                    M = Main_window.load_results[basic_combo][7][1][self.pattern_index]+ Main_window.load_results[basic_combo][7][0]
                else:
                    R = np.maximum.reduce(Main_window.load_results[basic_combo][6][1])+ Main_window.load_results[basic_combo][6][0]
                    M = np.maximum.reduce(Main_window.load_results[basic_combo][7][1])+ Main_window.load_results[basic_combo][7][0]
                    Rmin = np.minimum.reduce(Main_window.load_results[basic_combo][6][1])+ Main_window.load_results[basic_combo][6][0]
                    Mmin = np.minimum.reduce(Main_window.load_results[basic_combo][7][1])+ Main_window.load_results[basic_combo][7][0]
            else:
                if basic_combo == 11:
                    R = Main_window.displace_initial_results[4]
                    M = Main_window.displace_initial_results[5]
                else:
                    R = Main_window.load_results[basic_combo][6]
                    M = Main_window.load_results[basic_combo][7]
        else:
            pass
        
        if len(Rmin) == 0:
            r_string = 'Reactions (kips) : '
            for reaction in R:
                r_string = r_string + ' {0:.2f}  '.format(reaction[0]/1000)
            m_string = 'Moments at Supports (ft-kips) : '
            for moment in M:
                m_string = m_string + ' {0:.2f}  '.format(moment[0]/(1000*12))
        else:
            r_string = 'Max Reactions (kips) : '
            for reaction in R:
                r_string = r_string + ' {0:.2f}  '.format(reaction[0]/1000)
            r_string = r_string + '\nMin Reactions (kips) : '
            for reaction in Rmin:
                r_string = r_string + ' {0:.2f}  '.format(reaction[0]/1000)
            m_string = 'Max Moments at Supports (ft-kips) : '
            for moment in M:
                m_string = m_string + ' {0:.2f}  '.format(moment[0]/(1000*12))
            m_string = m_string + '\nMin Moments at Supports (ft-kips) : '
            for moment in Mmin:
                m_string = m_string + ' {0:.2f}  '.format(moment[0]/(1000*12))
    
        self.res_R.configure(text=r_string)
        self.res_M.configure(text=m_string)
        self.res_combo.configure(text=self.combo_string)

    def span_res_run(self, *event):
        dia = self.vmsd.get()
        station = self.span_res_scale.get()
        text_res = ''
        x=[]
        y=[]
        for j in range(self.x.shape[1]):
            if self.combo_string == 'LRFD Envelope' or self.combo_string == 'ASD/Basic Envelope' or self.pattern_string == 'Envelope':
                if j==0:
                    if dia == 1:
                        text_res = text_res + 'Span {2}: Vmax = {0:.3f} kips @ {1} ft\n'.format(self.y[station,j],self.x[station,j], j+1)
                        text_res = text_res + 'Span {2}: Vmin = {0:.3f} kips @ {1} ft\n'.format(self.ymin[station,j],self.x[station,j], j+1)
                    elif dia == 2:
                        text_res = text_res + 'Span {2}: Mmax = {0:.3f} ft-kips @ {1} ft\n'.format(self.y[station,j],self.x[station,j], j+1)
                        text_res = text_res + 'Span {2}: Mmin = {0:.3f} ft-kips @ {1} ft\n'.format(self.ymin[station,j],self.x[station,j], j+1)
                    elif dia == 3:
                        text_res = text_res + 'Span {2}: Smax = {0:.5f} rads @ {1} ft\n'.format(self.y[station,j],self.x[station,j], j+1)
                        text_res = text_res + 'Span {2}: Smin = {0:.5f} rads @ {1} ft\n'.format(self.ymin[station,j],self.x[station,j], j+1)
                    elif dia == 4:
                        text_res = text_res + 'Span {2}: Delta max = {0:.4f} in @ {1} ft\n'.format(self.y[station,j],self.x[station,j], j+1)
                        text_res = text_res + 'Span {2}: Delta min = {0:.4f} in @ {1} ft\n'.format(self.ymin[station,j],self.x[station,j], j+1)
                    else:
                        pass
                else:
                    if dia == 1:
                        text_res = text_res + 'Span {2}: Vmax = {0:.3f} kips @ {1} ft ({3} ft)\n'.format(self.y[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                        text_res = text_res + 'Span {2}: Vmin = {0:.3f} kips @ {1} ft ({3} ft)\n'.format(self.ymin[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                    elif dia == 2:
                        text_res = text_res + 'Span {2}: Mmax = {0:.3f} ft-kips @ {1} ft ({3} ft)\n'.format(self.y[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                        text_res = text_res + 'Span {2}: Mmin = {0:.3f} ft-kips @ {1} ft ({3} ft)\n'.format(self.ymin[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                    elif dia == 3:
                        text_res = text_res + 'Span {2}: Smax = {0:.5f} rads @ {1} ft ({3} ft)\n'.format(self.y[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                        text_res = text_res + 'Span {2}: Smin = {0:.5f} rads @ {1} ft ({3} ft)\n'.format(self.ymin[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                    elif dia == 4:
                        text_res = text_res + 'Span {2}: Delta max = {0:.4f} in @ {1} ft ({3} ft)\n'.format(self.y[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                        text_res = text_res + 'Span {2}: Delta min = {0:.4f} in @ {1} ft ({3} ft)\n'.format(self.ymin[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                    else:
                        pass
                x.append(self.x[station,j])
                y.append(self.y[station,j])
                x.append(self.x[station,j])
                y.append(self.ymin[station,j])
            else:
                if j==0:
                    if dia == 1:
                        text_res = text_res + 'Span {2}: V = {0:.3f} kips @ {1} ft\n'.format(self.y[station,j],self.x[station,j], j+1)
                    elif dia == 2:
                        text_res = text_res + 'Span {2}: M = {0:.3f} ft-kips @ {1} ft\n'.format(self.y[station,j],self.x[station,j], j+1)
                    elif dia == 3:
                        text_res = text_res + 'Span {2}: S = {0:.5f} rads @ {1} ft\n'.format(self.y[station,j],self.x[station,j], j+1)
                    elif dia == 4:
                        text_res = text_res + 'Span {2}: Delta = {0:.4f} in @ {1} ft\n'.format(self.y[station,j],self.x[station,j], j+1)
                    else:
                        pass
                else:
                    if dia == 1:
                        text_res = text_res + 'Span {2}: V = {0:.3f} kips @ {1} ft ({3} ft)\n'.format(self.y[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                    elif dia == 2:
                        text_res = text_res + 'Span {2}: M = {0:.3f} ft-kips @ {1} ft ({3} ft)\n'.format(self.y[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                    elif dia == 3:
                        text_res = text_res + 'Span {2}: S = {0:.5f} rads @ {1} ft ({3} ft)\n'.format(self.y[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                    elif dia == 4:
                        text_res = text_res + 'Span {2}: Delta = {0:.4f} in @ {1} ft ({3} ft)\n'.format(self.y[station,j],self.x[station,j], j+1,self.x[station,j]-self.x[-1,j-1])
                    else:
                        pass
                x.append(self.x[station,j])
                y.append(self.y[station,j])
            
        self.span_res_label.config(text = text_res)
        
        self.res_points[0].set_xdata(x)
        self.res_points[0].set_ydata(y)
        self.canvas.draw()

    def set_span_res_plus(self):
        station = self.span_res_scale.get()
        self.span_res_scale.set(station+1)
        
    def set_span_res_minus(self):
        station = self.span_res_scale.get()
        self.span_res_scale.set(station-1)
        
    def refreshFigure(self, x, y, yenv, dia, dec):
        self.x = x
        self.y = y
        self.ymin = yenv
        combo = self.combo_type.get()
        for i in range(x.shape[1]):
            self.linevmsd[i][0].set_ydata(y[:,i])
            self.lineenvmin[i][0].set_ydata(yenv[:,i])

        for i in range(len(self.clabels)):
            self.clabels[i].remove()

        del self.clabels[:]


        for i in range(len(self.clabels_pts)):
            self.clabels_pts[i][0].remove()

        del self.clabels_pts[:]

        fsi = 8
        msi = 2
        num_annos = self.annos_scale.get()
        for j in range(x.shape[1]):
             for z in range(0,num_annos):
                 if z==0:
                     k=0
                 else:
                     if z*int(Main_window.stations/(num_annos-1)) >= Main_window.stations:
                         k= Main_window.stations
                     else:
                         k=z*int(Main_window.stations/(num_annos-1))

                 if dec == 3:
                    self.clabels.append(self.FigSubPlot.annotate('{0:.3f}'.format(y[k,j]),xy=(x[k,j],y[k,j]), xytext=(2.5,1), textcoords='offset points',fontsize=fsi))
                    if self.combo_string == 'LRFD Envelope' or self.combo_string == 'ASD/Basic Envelope' or self.pattern_string == 'Envelope':
                        self.clabels.append(self.FigSubPlot.annotate('{0:.3f}'.format(yenv[k,j]),xy=(x[k,j],yenv[k,j]), xytext=(2.5,1), textcoords='offset points',fontsize=fsi))
                    else:
                        pass
                 elif dec ==4:
                    self.clabels.append(self.FigSubPlot.annotate('{0:.4f}'.format(y[k,j]),xy=(x[k,j],y[k,j]), xytext=(2.5,1), textcoords='offset points',fontsize=fsi))
                    if self.combo_string == 'LRFD Envelope' or self.combo_string == 'ASD/Basic Envelope' or self.pattern_string == 'Envelope':
                        self.clabels.append(self.FigSubPlot.annotate('{0:.4f}'.format(yenv[k,j]),xy=(x[k,j],yenv[k,j]), xytext=(2.5,1), textcoords='offset points',fontsize=fsi))
                    else:
                        pass
                 else:
                    self.clabels.append(self.FigSubPlot.annotate('{0:.2f}'.format(y[k,j]),xy=(x[k,j],y[k,j]), xytext=(2.5,1), textcoords='offset points',fontsize=fsi))
                    if self.combo_string == 'LRFD Envelope' or self.combo_string == 'ASD/Basic Envelope' or self.pattern_string == 'Envelope':
                        self.clabels.append(self.FigSubPlot.annotate('{0:.2f}'.format(yenv[k,j]),xy=(x[k,j],yenv[k,j]), xytext=(2.5,1), textcoords='offset points',fontsize=fsi))
                    else:
                        pass
                 self.clabels_pts.append(self.FigSubPlot.plot(x[k,j],y[k,j], 'ko', markersize=msi))
                 if self.combo_string == 'LRFD Envelope' or self.combo_string == 'ASD/Basic Envelope' or self.pattern_string == 'Envelope':
                    self.clabels_pts.append(self.FigSubPlot.plot(x[k,j],yenv[k,j], 'ko', markersize=msi))
                 else:
                    pass
        ax = self.canvas.figure.axes[0]
        ax.set_xlim(x.min()+(x.min()*0.125), x.max()+(x.max()*0.125))
        if self.combo_string == 'LRFD Envelope' or self.combo_string == 'ASD/Basic Envelope' or self.pattern_string == 'Envelope':
            ax.set_ylim(yenv.min()+(yenv.min()*0.125), y.max()+(y.max()*0.125))
        else:
            ax.set_ylim(y.min()+(y.min()*0.125), y.max()+(y.max()*0.125))
        self.FigSubPlot.set_xlabel('L (ft)')
        self.FigSubPlot.set_ylabel(dia)
        self.FigSubPlot.set_title(Main_window.calc_label+'\n'+self.combo_string+'\n'+self.pattern_string)
        self.canvas.draw()
        self.span_res_run()

    def vrun(self):
        combo = self.combo_type.get()
        dia = 'Shear (Kips)'

        if combo == 2:

            asd_combo = self.combo_index
            
            if asd_combo in range(0, len(self.asd_combos)):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.basic_v[asd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                    ymin = Main_window.bm
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. V (kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())
                else:
                    y = Main_window.basic_v_env_max[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                    ymin = Main_window.basic_v_env_min[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. V (kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())+line1+line2)
                    dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())
            else:
                y = Main_window.asd_v_max_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                ymin = Main_window.asd_v_min_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                x = Main_window.xs
                n = len(y[0])
                line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                for i in range(0,n):
                    line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                line2 = '\n  Min. V (kips): '
                for i in range(0,n):
                    line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                    
                self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())+line1+line2)
                dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())           

            self.refreshFigure(x,y,ymin,dia,2)
        
        elif combo ==3:

            lrfd_combo = self.combo_index
            
            if lrfd_combo in range(0, len(self.lrfd_combos)):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.lrfd_v[lrfd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                    ymin = Main_window.bm
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. V (kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())
                else:
                    y = Main_window.lrfd_v_env_max[lrfd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                    ymin = Main_window.lrfd_v_env_min[lrfd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. V (kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())+line1+line2)
                    dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())
            else:
                y = Main_window.lrfd_v_max_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                ymin = Main_window.lrfd_v_min_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[0])
                x = Main_window.xs
                n = len(y[0])
                line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                for i in range(0,n):
                    line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                line2 = '\n  Min. V (kips): '
                for i in range(0,n):
                    line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                    
                self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())+line1+line2)
                dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())           

            self.refreshFigure(x,y,ymin,dia,2)
        elif combo ==1:
            basic_combo = self.combo_index

            if self.combo_index in range(5,9):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.load_results[basic_combo][2][1][self.pattern_index]
                    if len(Main_window.load_results[basic_combo][2][0]) <= 1:
                        pass
                    else:
                        y = y + Main_window.load_results[basic_combo][2][0]
                    ymin = Main_window.bm
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. V (kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())
                else:
                    y = np.maximum.reduce(Main_window.load_results[basic_combo][2][1])
                    ymin = np.minimum.reduce(Main_window.load_results[basic_combo][2][1])
                    if len(Main_window.load_results[basic_combo][2][0]) <= 1:
                        pass
                    else:
                        y = y + Main_window.load_results[basic_combo][2][0]
                        ymin = ymin + Main_window.load_results[basic_combo][2][0]
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. V (kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())+line1+line2)
                    dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),ymin.min())                             
            else:
                if basic_combo == 11:
                    y = Main_window.displace_initial_results[0]
                    ymin = Main_window.bm
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. V (kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())
                else:
                    y = Main_window.load_results[basic_combo][2]
                    ymin = Main_window.bm
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. V (kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. V (kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. V: {0:.2f} kips  Min. V: {1:.2f} kips'.format(y.max(),y.min())
            
            self.refreshFigure(x,y,ymin,dia,2)

        else:
            pass

    def mrun(self):
        combo = self.combo_type.get()
        dia = 'Moment (Ft-Kips)'
        if combo == 2:

            asd_combo = self.combo_index
            if asd_combo in range(0, len(self.asd_combos)):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.basic_m[asd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                    ymin = Main_window.bm
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. M (ft-kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                    
                    self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())
                else:
                    y = Main_window.basic_m_env_max[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                    ymin = Main_window.basic_m_env_min[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. M (ft-kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                    
                    self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())+line1+line2)
                    dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())
            else:
                y = Main_window.asd_m_max_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                ymin = Main_window.asd_m_min_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                x = Main_window.xs

                n = len(y[0])
                line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                for i in range(0,n):
                    line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                line2 = '\n  Min. M (ft-kips): '
                for i in range(0,n):
                    line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                
                self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())+line1+line2)
                dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())
            self.refreshFigure(x,y,ymin,dia,2)
        elif combo ==3:
            lrfd_combo = self.combo_index
            if lrfd_combo in range(0, len(self.lrfd_combos)):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.lrfd_m[lrfd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                    ymin = Main_window.bm
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. M (ft-kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                    
                    self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())+line1+line2)
                    
                    dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())
                else:
                    y = Main_window.lrfd_m_env_max[lrfd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                    ymin = Main_window.lrfd_m_env_min[lrfd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. M (ft-kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                    
                    self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())+line1+line2)
                    
                    dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())
            else:
                y = Main_window.lrfd_m_max_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                ymin = Main_window.lrfd_m_min_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[1])
                x = Main_window.xs

                n = len(y[0])
                line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                for i in range(0,n):
                    line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                line2 = '\n  Min. M (ft-kips): '
                for i in range(0,n):
                    line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                
                self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())+line1+line2)
                
                dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())

            self.refreshFigure(x,y,ymin,dia,2)
        elif combo ==1:
            basic_combo = self.combo_index
            
            if basic_combo in range(5,9):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.load_results[basic_combo][3][1][self.pattern_index]
                    if len(Main_window.load_results[basic_combo][3][0]) <= 1:
                        pass
                    else:
                        y = y + Main_window.load_results[basic_combo][3][0]
                    ymin = Main_window.bm
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. M (ft-kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                    
                    self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())
                else:
                    y = np.maximum.reduce(Main_window.load_results[basic_combo][3][1])
                    ymin = np.minimum.reduce(Main_window.load_results[basic_combo][3][1])
                    if len(Main_window.load_results[basic_combo][3][0]) <= 1:
                        pass
                    else:
                        y = y + Main_window.load_results[basic_combo][3][0]
                        ymin = ymin + Main_window.load_results[basic_combo][3][0]
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. M (ft-kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(ymin[:,i].min())
                    
                    self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())+line1+line2)
                    dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),ymin.min())          
            else:
                if basic_combo == 11:
                    y = Main_window.displace_initial_results[1]
                    ymin = Main_window.bm
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. M (ft-kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                        
                    self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())
                else:
                    y = Main_window.load_results[basic_combo][3]
                    ymin = Main_window.bm
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. M (ft-kips): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.2f}  '.format(y[:,i].max())
                    line2 = '\n  Min. M (ft-kips): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.2f}  '.format(y[:,i].min())
                    
                    self.res_min_max.configure(text='   Max. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())+line1+line2)
                    dia = dia + '\nMax. M: {0:.2f} ft-kips  Min. M: {1:.2f} ft-kips'.format(y.max(),y.min())
            self.refreshFigure(x,y,ymin,dia,2)
        else:
            pass

    def srun(self):
        combo = self.combo_type.get()
        dia ='Slope (Rad)'
        if combo == 2:

            asd_combo = self.combo_index
            if asd_combo in range(0, len(self.asd_combos)):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.basic_s[asd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[2])
                    ymin = Main_window.bm
                    x = Main_window.xs

                    self.res_min_max.configure(text='   Max. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),y.min()))
                    dia = dia+'\nMax. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),y.min())
                else:
                    y = Main_window.basic_s_env_max[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[2])
                    ymin = Main_window.basic_s_env_min[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[2])
                    x = Main_window.xs

                    self.res_min_max.configure(text='   Max. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),ymin.min()))
                    dia = dia+'\nMax. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),ymin.min())
            else:
                y = Main_window.asd_s_max_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[2])
                ymin = Main_window.asd_s_min_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[2])
                x = Main_window.xs

                self.res_min_max.configure(text='   Max. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),ymin.min()))
                dia = dia+'\nMax. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),ymin.min())           
            self.refreshFigure(x,y,ymin,dia,4)
        elif combo ==3:
            pass
        elif combo ==1:
            basic_combo = self.combo_index
            if basic_combo in range(5,9):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.load_results[basic_combo][4][1][self.pattern_index]
                    if len(Main_window.load_results[basic_combo][4][0]) <= 1:
                        pass
                    else:
                        y = y + Main_window.load_results[basic_combo][4][0]
                    ymin = Main_window.bm
                    x = Main_window.xs
                    self.res_min_max.configure(text='   Max. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),y.min()))
                    dia = dia+'\nMax. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),y.min())
                else:
                    y = np.maximum.reduce(Main_window.load_results[basic_combo][4][1])
                    ymin = np.minimum.reduce(Main_window.load_results[basic_combo][4][1])
                    if len(Main_window.load_results[basic_combo][5][0]) <= 1:
                        pass
                    else:
                        y = y + Main_window.load_results[basic_combo][4][0]
                        ymin = ymin + Main_window.load_results[basic_combo][4][0]
                    x = Main_window.xs
                    self.res_min_max.configure(text='   Max. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),ymin.min()))
                    dia = dia+'\nMax. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),ymin.min())                             
            else:
                if basic_combo == 11:
                    y = Main_window.displace_initial_results[2]
                    ymin = Main_window.bm
                    x = Main_window.xs
                    self.res_min_max.configure(text='   Max. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),y.min()))
                    dia = dia+'\nMax. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),y.min())
                    
                else:
                    y = Main_window.load_results[basic_combo][4]
                    ymin = Main_window.bm
                    x = Main_window.xs

                    self.res_min_max.configure(text='   Max. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),y.min()))
                    dia = dia+'\nMax. S: {0:.4f} rad  Min. S: {1:.4f} rad'.format(y.max(),y.min())
            self.refreshFigure(x,y,ymin,dia,4)
        else:
            pass

    def drun(self):
        combo = self.combo_type.get()
        dia = 'Deflection (in)'
        if combo == 2:

            asd_combo = self.combo_index
            if asd_combo in range(0, len(self.asd_combos)):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.basic_d[asd_combo][1][self.pattern_index] - (self.sup_disp_var.get() * Main_window.displace_initial_results[3])
                    ymin = Main_window.bm
                    x = Main_window.xs
                    
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. D (in): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.4f}  '.format(y[:,i].max())
                    line2 = '\n  Min. D (in): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.4f}  '.format(y[:,i].min())
                    line2 = line2 + '\n  Goal L/240 (in): '
                    for i in range(0,n):
                        line2 = line2 + '+/-{0:.4f}  '.format(Main_window.total_deflection_goal[i])
                    self.res_min_max.configure(text='   Max. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),y.min())
                else:
                    y = Main_window.basic_d_env_max[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[3])
                    ymin = Main_window.basic_d_env_min[asd_combo] - (self.sup_disp_var.get() * Main_window.displace_initial_results[3])
                    x = Main_window.xs
                    
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. D (in): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.4f}  '.format(y[:,i].max())
                    line2 = '\n  Min. D (in): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.4f}  '.format(ymin[:,i].min())
                    line2 = line2 + '\n  Goal L/240 (in): '
                    for i in range(0,n):
                        line2 = line2 + '+/-{0:.4f}  '.format(Main_window.total_deflection_goal[i])
                    self.res_min_max.configure(text='   Max. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),ymin.min())+line1+line2)
                    dia = dia+'\nMax. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),ymin.min())
            else:
                y = Main_window.asd_d_max_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[3])
                ymin = Main_window.asd_d_min_diag - (self.sup_disp_var.get() * Main_window.displace_initial_results[3])
                x = Main_window.xs
                
                n = len(y[0])
                line1 = '\n  Per Span Max/Min:\n  Max. D (in): '
                for i in range(0,n):
                    line1 = line1 + '{0:.4f}  '.format(y[:,i].max())
                line2 = '\n  Min. D (in): '
                for i in range(0,n):
                    line2 = line2 + '{0:.4f}  '.format(ymin[:,i].min())
                line2 = line2 + '\n  Goal L/240 (in): '
                for i in range(0,n):
                    line2 = line2 + '+/-{0:.4f}  '.format(Main_window.total_deflection_goal[i])
                self.res_min_max.configure(text='   Max. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),ymin.min())+line1+line2)
                dia = dia+'\nMax. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),ymin.min())
            self.refreshFigure(x,y,ymin,dia,3)
        elif combo ==3:
            pass
        elif combo ==1:
            basic_combo = self.combo_index
            
            if basic_combo in range(5,9):
                if self.pattern_index in range(0,len(Main_window.pats)):
                    y = Main_window.load_results[basic_combo][5][1][self.pattern_index]
                    if len(Main_window.load_results[basic_combo][5][0]) <= 1:
                        pass
                    else:
                        y = y + Main_window.load_results[basic_combo][5][0]
                    ymin = Main_window.bm
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. D (in): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.4f}  '.format(y[:,i].max())
                    line2 = '\n  Min. D (in): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.4f}  '.format(y[:,i].min())
                    line2 = line2 + '\n  Goal L/360 (in): '
                    for i in range(0,n):
                        line2 = line2 + '+/-{0:.4f}  '.format(Main_window.live_deflection_goal[i])
                    self.res_min_max.configure(text='   Max. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),y.min())
                else:
                    y = np.maximum.reduce(Main_window.load_results[basic_combo][5][1])
                    ymin = np.minimum.reduce(Main_window.load_results[basic_combo][5][1])
                    if len(Main_window.load_results[basic_combo][5][0]) <= 1:
                        pass
                    else:
                        y = y + Main_window.load_results[basic_combo][5][0]
                        ymin = ymin + Main_window.load_results[basic_combo][5][0]
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. D (in): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.4f}  '.format(y[:,i].max())
                    line2 = '\n  Min. D (in): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.4f}  '.format(ymin[:,i].min())
                    line2 = line2 + '\n  Goal L/360 (in): '
                    for i in range(0,n):
                        line2 = line2 + '+/-{0:.4f}  '.format(Main_window.live_deflection_goal[i])
                    self.res_min_max.configure(text='   Max. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),ymin.min())+line1+line2)
                    dia = dia+'\nMax. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),ymin.min())
            else:
                if basic_combo == 11:
                    y = Main_window.displace_initial_results[3]
                    ymin = Main_window.bm
                    x = Main_window.xs
                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. D (in): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.4f}  '.format(y[:,i].max())
                    line2 = '\n  Min. D (in): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.4f}  '.format(y[:,i].min())
                    self.res_min_max.configure(text='   Max. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),y.min())
                
                else:
                    y = Main_window.load_results[basic_combo][5]
                    ymin = Main_window.bm
                    x = Main_window.xs

                    n = len(y[0])
                    line1 = '\n  Per Span Max/Min:\n  Max. D (in): '
                    for i in range(0,n):
                        line1 = line1 + '{0:.4f}  '.format(y[:,i].max())
                    line2 = '\n  Min. D (in): '
                    for i in range(0,n):
                        line2 = line2 + '{0:.4f}  '.format(y[:,i].min())
                    self.res_min_max.configure(text='   Max. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),y.min())+line1+line2)
                    dia = dia+'\nMax. D: {0:.4f} in.  Min. D: {1:.4f} in.'.format(y.max(),y.min())
            self.refreshFigure(x,y,ymin,dia,3)
        else:
            pass

class Main_window:

    def __init__(self, master):
        self.master = master
        self.menubar = tk.Menu(self.master)
        self.menu = tk.Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label = "File", menu=self.menu)
        self.menu.add_command(label="Open", command=self.open_calc)
        self.menu.add_separator()
        self.menu.add_command(label="Save Inputs", command=self.print_ins)
        self.menu.add_command(label="Run", state="disabled", command= self.run_file)
        self.menu.add_command(label="Results", state="disabled", command= self.res_window)
        self.menu.add_separator()
        self.menu.add_command(label="Exit", command=self.quit_app)
        
        try:
            self.master.config(menu=self.menubar)
        except AttributeError:
            self.master.tk.call(master, "config", "-menu", self.menubar)

        self.main_frame = tk.Frame(self.master, bd=2, relief='sunken', padx=10,pady=20)
        self.main_frame.pack(anchor='c', padx= 10, pady= 20)
        
        self.bminfo = tk.StringVar()
        self.bminfol = tk.Label(self.main_frame, text="Calculation Label : ")
        self.bminfol.grid(row=0,column=0, pady=10, sticky="E")
        self.e_bminfo = tk.Entry(self.main_frame,textvariable=self.bminfo)
        self.e_bminfo.grid(row=0,column=1, pady=10)

        self.E = tk.StringVar()
        self.El = tk.Label(self.main_frame, text="E (ksi) : \nGlobal = All Spans", justify=tk.RIGHT)
        self.El.grid(row=1,column=0, pady=10, sticky="E")
        self.e_E = tk.Entry(self.main_frame,textvariable=self.E)
        self.e_E.grid(row=1,column=1, pady=10)

        self.span = tk.StringVar()
        self.spanl = tk.Label(self.main_frame, text="Span (ft) : ")
        self.spanl.grid(row=2,column=0, sticky="E")
        self.e_span = tk.Entry(self.main_frame,textvariable=self.span)
        self.e_span.grid(row=2,column=1)

        self.I = tk.StringVar()
        self.Il = tk.Label(self.main_frame, text="I (In^4) : ")
        self.Il.grid(row=3,column=0, sticky="E")
        self.e_I = tk.Entry(self.main_frame,textvariable=self.I)
        self.e_I.grid(row=3,column=1)

        self.cantl = tk.Label(self.main_frame, text="Cantilever L,R,B,N : ")
        self.cantl.grid(row=4,column=0, sticky="E")
        self.cant_in = tk.StringVar()
        self.cant_in.set('N')
        self.e_cant = tk.OptionMenu(self.main_frame,self.cant_in, 'L','R','B','N')
        self.e_cant.grid (row=4,column=1, padx= 10, sticky=tk.W)

        self.p_w1 = tk.StringVar()
        self.p_w1l = tk.Label(self.main_frame, text="P or w1 (kips/klf) : ")
        self.p_w1l.grid(row=5,column=0, sticky="E")
        self.e_p = tk.Entry(self.main_frame,textvariable=self.p_w1)
        self.e_p.grid(row=5,column=1)

        self.w2 = tk.StringVar()
        self.w2l = tk.Label(self.main_frame, text="w2 (klf) : ")
        self.w2l.grid(row=6,column=0, sticky="E")
        self.e_w2 = tk.Entry(self.main_frame,textvariable=self.w2)
        self.e_w2.grid(row=6,column=1)

        self.a = tk.StringVar()
        self.al = tk.Label(self.main_frame, text="a (ft) : ")
        self.al.grid(row=7,column=0, sticky="E")
        self.e_a = tk.Entry(self.main_frame,textvariable=self.a)
        self.e_a.grid(row=7,column=1)

        self.b =tk. StringVar()
        self.bl = tk.Label(self.main_frame, text="b (ft) : ")
        self.bl.grid(row=8,column=0, sticky="E")
        self.e_b = tk.Entry(self.main_frame,textvariable=self.b)
        self.e_b.grid(row=8,column=1)

        self.load_type = tk.StringVar()
        self.load_type.set('POINT')
        self.applied_loads_allow = ['POINT','UDL','TRAP']
        self.ltl = tk.Label(self.main_frame, text="Load Type (POINT, UDL, TRAP) : ")
        self.ltl.grid(row=9,column=0, sticky="E")
        self.e_load_type = tk.OptionMenu(self.main_frame,self.load_type,'POINT','UDL','TRAP')
        self.e_load_type.grid(row=9,column=1, padx= 10, sticky=tk.W)

        self.load_span = tk.IntVar()
        self.lsl = tk.Label(self.main_frame, text="Load in span : ")
        self.lsl.grid(row=10,column=0, sticky="E")
        self.e_load_span = tk.OptionMenu(self.main_frame, self.load_span, 1)
        self.e_load_span.grid(row=10,column=1, padx= 10, sticky=tk.W)

        self.load_types = ['D', 'Ex', 'Ey', 'F', 'H', 'L', 'Lr', 'R', 'S', 'Wx', 'Wy']
        self.load_kind = tk.StringVar()
        self.load_kind.set('D')
        self.lkl = tk.Label(self.main_frame, text='Load Type: ' + ','.join(self.load_types))
        self.lkl.grid(row=11,column=0, sticky="E")
        self.e_load_kind = tk.OptionMenu(self.main_frame, self.load_kind, 'D', 'Ex', 'Ey', 'F', 'H', 'L', 'Lr', 'R', 'S', 'Wx', 'Wy')
        self.e_load_kind.grid(row=11, column=1, padx= 10, sticky=tk.W)
        self.l_pattern_var = tk.IntVar()
        self.ch_l_pattern = tk.Checkbutton(self.main_frame, text=": Pattern Load\n(Only impacts L,Lr,R, and S)", justify=tk.LEFT, variable=self.l_pattern_var)
        self.ch_l_pattern.grid(row=12, column=1, padx= 10, sticky=tk.W)
        self.f_lrfd_frame = tk.Frame(self.main_frame)
        self.fi_lrfd = tk.StringVar()
        self.fi_lrfd.set('1.00')
        self.fi_lrfd_label = tk.Label(self.f_lrfd_frame, text='F1')
        self.fi_lrfd_label.pack(side=tk.LEFT)
        self.e_fi_lrfd = tk.OptionMenu(self.f_lrfd_frame, self.fi_lrfd, '1.00', '0.5')
        self.e_fi_lrfd.pack(side=tk.LEFT)
        self.fy_lrfd = tk.StringVar()
        self.fy_lrfd.set('0.7')
        self.fy_lrfd_label = tk.Label(self.f_lrfd_frame, text='F2')
        self.fy_lrfd_label.pack(side=tk.LEFT)
        self.e_fy_lrfd = tk.OptionMenu(self.f_lrfd_frame, self.fy_lrfd, '0.7', '0.2')
        self.e_fy_lrfd.pack(side=tk.LEFT)
        self.f_lrfd_frame.grid(row=12, column=0, padx= 10, sticky=tk.W)
        
        self.point_gif = PhotoImage(file="point.gif")
        self.point_key = tk.Label(self.main_frame,image=self.point_gif)
        self.point_key.point_gif = self.point_gif
        self.point_key.grid(row=13, column = 0, padx=5, pady=5)

        self.udl_gif = PhotoImage(file="udl.gif")
        self.udl_key = tk.Label(self.main_frame,image=self.udl_gif)
        self.udl_key.udl_gif = self.udl_gif
        self.udl_key.grid(row=13, column = 1, padx=5, pady=5)

        self.spans = tk.Label(self.main_frame, text="Spans (ft)")
        self.I_label = tk.Label(self.main_frame,text="I (in^4)")
        self.loads = tk.Label(self.main_frame, text="Loads")
        self.spans.grid(row=0, column=4)
        self.loads.grid(row=0, column=11)
        self.I_label.grid(row=0, column=6)

        self.lb_spans = tk.Listbox(self.main_frame,height = 10, width = 10)
        self.lb_spans.grid(row=1, column=4, columnspan=2, rowspan = 9, sticky='WENS', padx=5, pady=5)
        self.lb_spans.bind("<<ListboxSelect>>",self.span_click)

        self.lb_I = tk.Listbox(self.main_frame,height = 10, width = 10)
        self.lb_I.grid(row=1, column=6, columnspan=2, rowspan = 9, sticky='WENS', padx=5, pady=5)

        self.lb_loads = tk.Listbox(self.main_frame,height = 10, width = 20)
        self.lb_loads.grid(row=1, column=9, columnspan = 10, rowspan = 9,sticky='WENS', padx=5, pady=5 )
        self.lb_loads.bind("<<ListboxSelect>>",self.load_click)
        
        self.support_displace_label = tk.Label(self.main_frame, text="Support Displacements (in.):\n(+ is upward)")
        self.support_displace_label.grid(row=11, column =3, padx=5, pady=5)
        self.displace_widget = []
        
        self.b1 = tk.Button(self.main_frame,text="Close", command=self.quit_app)
        self.b1.grid(row=13, column=19, padx=5, pady=5)
        self.bprint = tk.Button(self.main_frame,text="Save Inputs", command=self.print_ins)
        self.bprint.grid(row=13, column =18, padx=5, pady=5)
        self.b_span_add = tk.Button(self.main_frame,text="Add Span/I +", command=self.add_span)
        self.b_span_min = tk.Button(self.main_frame,text="Remove Span/I -", command=self.remove_span)
        self.b_span_change = tk.Button(self.main_frame, text="Change Selected Span", command=self.change_span)
        self.b_span_change.configure(state="disabled")
        self.b_load_add = tk.Button(self.main_frame,text="Add Load +", command=self.add_load)
        self.b_load_addtoall = tk.Button(self.main_frame,text="Add UDL to All", command=self.add_udl_to_all)
        self.b_load_addtraptoall = tk.Button(self.main_frame,text="Add Full Length Trap", command=self.add_full_length_trap)
        self.b_load_min = tk.Button(self.main_frame,text="Remove Load -", command=self.remove_load)
        self.b_load_change = tk.Button(self.main_frame, text="Change Selected Load", command=self.change_load)
        self.b_load_change.configure(state="disabled")
        self.b_span_add.grid(row=1, column=3, padx=5, pady=5)
        self.b_span_min.grid(row=2, column=3, padx=5, pady=5)
        self.b_span_change.grid(row=3, column=3, padx=5, pady=5)
        self.b_load_add.grid(row=5, column=3, padx=5, pady=5)
        self.b_load_min.grid(row=6, column=3, padx=5, pady=5)
        self.b_load_change.grid(row=7, column=3, padx=5, pady=5)
        self.b_load_addtoall.grid(row=8, column=3, padx=5, pady=5)
        self.b_load_addtraptoall.grid(row=9, column=3, padx=5, pady=5)

        self.brun = tk.Button(self.main_frame, text="Run", command= self.run_file)
        self.brun.configure(state="disabled", bg='red')
        self.brun.grid(row = 13, column=17, padx=5, pady=5)

        self.bresults = tk.Button(self.main_frame, text="Results", command= self.res_window)
        self.bresults.grid(row = 13, column=16, padx=5, pady=5)
        self.bresults.configure(state="disabled", bg='red')

        self.ins_validate()
        self.license_display()
    
    def license_display(self, *event):
        license_string = ("Copyright (c) 2019, Donald N. Bockoven III\n"
                            "All rights reserved.\n\n"
                            "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\""
                            " AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"
                            " IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE"
                            " DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE"
                            " FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"
                            " DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR"
                            " SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER"
                            " CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,"
                            " OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE"
                            " OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
                            "https://github.com/buddyd16/Structural-Engineering/blob/master/LICENSE"
                            )
        tkMessageBox.showerror("License Information",license_string)
        self.master.focus_force()
        
    def _reset_option_menu(self, spans):
        '''reset the values in the option menu
        if index is given, set the value of the menu to
        the option at the given index
        '''
        menu = self.e_load_span["menu"]
        menu.delete(0, "end")
        if spans==1:
            menu.add_command(spans)
        else:
            for span in spans:
                menu.add_command(label=span,
                                command=lambda value=span:
                                    self.load_span.set(value))

    def quit_app(self):
        self.master.destroy()
        self.master.quit()

    def open_calc(self):
        filename = tkFileDialog.askopenfilename()
        calc_file = open(filename,'r')

        calc_data = calc_file.readlines()

        calc_file.close()

        beam_spans = []
        beam_momentofinertia=[]
        beam_elasticmodulus=[]
        beam_loads_raw = []
        cant = []
        sup_disp = []

        i=0
        for line in calc_data:
            if i == 0:
                beam_label = line.rstrip('\n')
            elif i<6:
                p = line.split(',')
                for items in p:
                    if i==1:
                        beam_spans.append(items.rstrip('\n'))
                    elif i==2:
                        beam_momentofinertia.append(items.rstrip('\n'))
                    elif i==3:
                        beam_elasticmodulus.append(items.rstrip('\n'))
                    elif i==4:
                        cant.append(items.rstrip('\n'))
                    elif i==5:
                        sup_disp.append(items.rstrip('\n'))
                    else:
                        pass
            elif i>7:
                beam_loads_raw.append(line.rstrip('\n'))
            else:
                pass

            i+=1

        del beam_spans[0]
        del beam_momentofinertia[0]
        del beam_elasticmodulus[0]
        del cant[0]

        self.bminfo.set(beam_label)
        self.cant_in.set(cant[0])
        self.E.set(beam_elasticmodulus[0])

        self.lb_spans.delete(0,tk.END)
        self.lb_I.delete(0,tk.END)
        for i in range(len(beam_spans)):
            self.lb_spans.insert(tk.END,beam_spans[i])
            self.lb_I.insert(tk.END,beam_momentofinertia[i])

        self.lb_loads.delete(0,tk.END)
        for load in beam_loads_raw:
            self.lb_loads.insert(tk.END,load)
        self._reset_option_menu(range(1,self.lb_spans.size()+1))
        self.ins_validate()
        for widget in self.displace_widget:
            widget.destroy()
        del self.displace_widget[:]

        for i in range(0,self.lb_spans.size()+1):
            self.displace_widget.append(tk.Entry(self.main_frame,width = 5, justify=tk.CENTER))
            self.displace_widget[i].insert(tk.END, sup_disp[i])
            self.displace_widget[i].grid(row=11,column=5+i, padx= 2)
        
        if self.cant_in.get() == 'L' or self.cant_in.get() == 'B':
            self.displace_widget[0].configure(state="disabled")
            self.displace_widget[0].delete(0,tk.END)
            self.displace_widget[0].insert(tk.END, '0.0')
        else:
            self.displace_widget[0].configure(state="normal")
        
        if self.cant_in.get() == 'R' or self.cant_in.get() == 'B':
            self.displace_widget[-1].configure(state="disabled")
            self.displace_widget[-1].delete(0,tk.END)
            self.displace_widget[-1].insert(tk.END, '0.0')
        else:
            self.displace_widget[-1].configure(state="normal")
        self.brun.configure(state="normal", bg='yellow')

    def res_window(self):
        self.newWindow = tk.Toplevel(self.master)
        self.res_app = Results_window(self.newWindow)

    def ins_validate(self):
        if self.lb_spans.size() == 0 or self.lb_I.size()==0 or self.lb_loads.size()==0:
            self.bprint.configure(state ="disabled", bg='red')
        else:
            self.bprint.configure(state="normal", bg='yellow')

    def print_ins(self):
        if self.lb_spans.size() == 0 or self.lb_I.size()==0 or self.lb_loads.size()==0:
            pass
        else:
            p_loads = self.lb_loads.get(0,tk.END)
            p_spans = self.lb_spans.get(0,tk.END)
            p_I = self.lb_I.get(0,tk.END)
            p_E = self.e_E.get()

            label = self.e_bminfo.get()
            Main_window.calc_label = label
            path = os.path.join(os.path.expanduser('~'),'Desktop','RESULTS', label)

            path_exists(path)
            sup_disp = '' 
            for widget in self.displace_widget:            
                sup_disp = sup_disp + '{0},'.format(widget.get())
            sup_disp = sup_disp[:-1]

            file = open(os.path.join(path,label + '_00_beam_info.txt'),'w')
            file.write(label + '\n')
            file.write('L_ft')
            for line in p_spans:
                file.write(','+line)
            file.write('\nI_in4')
            for line in p_I:
                file.write(','+line)
            file.write('\nE_ksi,'+p_E+'\ncant,'+self.cant_in.get()+'\n'+sup_disp+'\n**Loads**\n''p1(kips or klf)'',''p2(kips or klf)'',a,b,''POINT,UDL,TRAP'' **Do Not Delete This Line, Caps Matter for Load Type**,span\n')
            for line in p_loads:
                file.write(line + '\n')
            file.close()

            self.brun.configure(state="normal", bg='yellow')
            self.bprint.configure(state="normal", bg='green')
            self.menu.entryconfig(3, state="normal")
    def load_input_validation(self):
        if self.e_p.get()=='' or self.e_w2.get()=='' or self.e_a.get()=='' or self.e_b.get()=='' or self.load_type.get()=='' or self.load_span.get() =='' or self.load_kind.get()=='':
            return 0
        else:
            if self.load_type.get() in self.applied_loads_allow and self.load_kind.get() in self.load_types:
                a = float(self.e_a.get())
                b = float(self.e_b.get())
                span = self.load_span.get()
                span_l = float(self.lb_spans.get(span-1))
                w1 = float(self.e_p.get())
                w2 = float(self.e_w2.get())
                if w2 == 0:
                    trap_reversal_check = 1
                else:
                    trap_reversal_check = w1/w2
                
                if a < 0 or a > span_l or b<a or b> span_l or trap_reversal_check < 0:
                    return 0
                else:
                    return 1
    def add_load(self):
        load_test = self.load_input_validation()
        
        if load_test == 0:
            pass
        else:
            load = '{0},{1},{2},{3},{4},{5},{6},{7}'.format(self.e_p.get(),self.e_w2.get(),self.e_a.get(),self.e_b.get(),self.load_type.get(),self.load_span.get(),self.load_kind.get(),self.l_pattern_var.get())
            self.lb_loads.insert(tk.END,load)

        self.ins_validate()
        
    def add_udl_to_all(self):
        spans = self.lb_spans.size()
        a = self.e_a.get()
        b = self.e_b.get()
        w1 = float(self.e_p.get())
        w2 = float(self.e_w2.get())
        
        if w1 == 0:
            pass
        else:
            if w2 != w1:
                pass
            elif spans == 0:
                pass
            else:
                i=0
                for i in range(0,spans):
                    span_l = self.lb_spans.get(i)
                    b = self.e_b.get()
                    if float(a) < 0 or float(a) > float(span_l) or float(b)<float(a):
                        pass
                        self.ins_validate()
                    if float(b) > float(span_l):
                        b = span_l
                        load = '{0},{1},{2},{3},{4},{5},{6},{7}'.format(self.e_p.get(),self.e_w2.get(),self.e_a.get(),b,'UDL',i+1,self.load_kind.get(),self.l_pattern_var.get())
                        self.lb_loads.insert(tk.END,load)
                        self.ins_validate()
                    else:
                        load = '{0},{1},{2},{3},{4},{5},{6},{7}'.format(self.e_p.get(),self.e_w2.get(),self.e_a.get(),self.e_b.get(),'UDL',i+1,self.load_kind.get(),self.l_pattern_var.get())
                        self.lb_loads.insert(tk.END,load)
                        self.ins_validate()
    def add_full_length_trap(self):
        num_spans = self.lb_spans.size()
        w1 = float(self.e_p.get())
        w2 = float(self.e_w2.get())
        span_l = []
        if w1==0 and w2==0 or num_spans == 0 :
            pass
        else:
            if w2 != 0 and w1/w2 < 0:
                runme = 0
            else:
                runme = 1
            
            if runme == 1:
                spans_l_string = self.lb_spans.get(0,tk.END)
                
                for line in spans_l_string:
                    span_l.append(float(line))
                    
                overall_length = sum(span_l)
                slope = (w1-w2)/overall_length
                
                for i in range(0,len(span_l)):
                    if i == 0:
                        w1_out = w1
                        a=0
                        b=span_l[i]
                        w2_out = w1-(slope*span_l[i])
                    else:
                        w1_out = w2_out
                        a=0
                        b=span_l[i]
                        w2_out = w1_out-(slope*span_l[i])
                        if i == len(span_l)-1 and w2 == 0:
                            w2_out = 0
                        else:
                            w2_out = w2_out
                    load = '{0},{1},{2},{3},{4},{5},{6},{7}'.format(w1_out,w2_out,a,b,'TRAP',i+1,self.load_kind.get(),self.l_pattern_var.get())
                    self.lb_loads.insert(tk.END,load)
                    self.ins_validate()
            else:
                pass
            
    def remove_load(self):
        self.lb_loads.delete(tk.END)

        self.ins_validate()

    def load_click(self,*event):
        if self.lb_loads.size()==0:
            pass
        else:
            self.b_load_change.configure(state="normal")
            self.selected_load = self.lb_loads.get(self.lb_loads.curselection()[0]).split(',')
            self.load_change_index = self.lb_loads.curselection()[0]

            self.p_w1.set(self.selected_load[0])
            self.w2.set(self.selected_load[1])
            self.a.set(self.selected_load[2])
            self.b.set(self.selected_load[3])
            self.load_type.set(self.selected_load[4])
            self.load_span.set(self.selected_load[5])
            self.load_kind.set(self.selected_load[6])
            self.l_pattern_var.set(self.selected_load[7])

    def change_load(self):
        if self.e_p.get()=='' or self.e_w2.get()=='' or self.e_a.get()=='' or self.e_b.get()=='' or self.load_type.get()=='' or self.load_span.get() =='' or self.load_kind.get()=='':
            pass
        else:
            if self.load_type.get() in self.applied_loads_allow and self.load_kind.get() in self.load_types:
                load = '{0},{1},{2},{3},{4},{5},{6},{7}'.format(self.e_p.get(),self.e_w2.get(),self.e_a.get(),self.e_b.get(),self.load_type.get(),self.load_span.get(),self.load_kind.get(),self.l_pattern_var.get())
                self.lb_loads.delete(self.load_change_index)
                self.lb_loads.insert(self.load_change_index,load)
                self.b_load_change.configure(state="disabled")
            else:
                pass

        self.ins_validate()

    def add_span(self):
        for widget in self.displace_widget:
            widget.destroy()
        del self.displace_widget[:]
        if self.e_span.get()=='' or self.e_I.get()=='':
            pass
        else:
            self.lb_spans.insert(tk.END,self.e_span.get())
            self.lb_I.insert(tk.END,self.e_I.get())
        if self.e_span.get()=='' or self.lb_spans.size()==1:
            self.load_span.set(1)
            self._reset_option_menu([1])
        else:
            self._reset_option_menu(range(1,self.lb_spans.size()+1))
        
        for i in range(0,self.lb_spans.size()+1):
            self.displace_widget.append(tk.Entry(self.main_frame,width = 5, justify=tk.CENTER))
            self.displace_widget[i].insert(tk.END, '0.0')
            self.displace_widget[i].grid(row=11,column=5+i, padx= 2)
        
        if self.cant_in.get() == 'L' or self.cant_in.get() == 'B':
            self.displace_widget[0].configure(state="disabled")
            self.displace_widget[0].delete(0,tk.END)
            self.displace_widget[0].insert(tk.END, '0.0')
        else:
            self.displace_widget[0].configure(state="normal")
        
        if self.cant_in.get() == 'R' or self.cant_in.get() == 'B':
            self.displace_widget[-1].configure(state="disabled")
            self.displace_widget[-1].delete(0,tk.END)
            self.displace_widget[-1].insert(tk.END, '0.0')
        else:
            self.displace_widget[-1].configure(state="normal")
        
            
        self.ins_validate()

    def remove_span(self):
        self.lb_spans.delete(tk.END)
        self.lb_I.delete(tk.END)
        if self.e_span.get()=='' or self.lb_spans.size()==1:
            self.load_span.set(1)
            self._reset_option_menu([1])
            if self.e_span.get()=='':
                for widget in self.displace_widget:
                    widget.destroy()
                del self.displace_widget[:]
            else:
                self.displace_widget[-1].destroy()
                del self.displace_widget[-1]
        else:
            self._reset_option_menu(range(1,self.lb_spans.size()+1))
            self.displace_widget[-1].destroy()
            del self.displace_widget[-1]

        self.ins_validate()

    def span_click(self,*event):
        if self.lb_spans.size()==0:
            pass
        else:
            self.b_span_change.configure(state="normal")
            self.span_change_index = self.lb_spans.curselection()[0]
            self.selected_span = self.lb_spans.get(self.span_change_index)
            self.selected_I = self.lb_I.get(self.span_change_index)

            self.span.set(self.selected_span)
            self.I.set(self.selected_I)

    def change_span(self):
        if self.e_span.get()=='' or self.e_I.get()=='':
            pass
        else:
            self.lb_spans.delete(self.span_change_index)
            self.lb_I.delete(self.span_change_index)

            self.lb_spans.insert(self.span_change_index,self.e_span.get())
            self.lb_I.insert(self.span_change_index,self.e_I.get())
            self.b_span_change.configure(state="disable")

        self.ins_validate()

    def run_file(self):
        bmlabel = self.e_bminfo.get()
        #--------------
        # Initial Inputs From Text File created by print_ins function
        #--------------
        path = os.path.join(os.path.expanduser('~'),'Desktop','RESULTS', bmlabel)

        path_exists(path)

        f1=open(os.path.join(path,bmlabel+'_00_beam_info.txt'),'r')

        beam_info_raw = f1.readlines()

        f1.close()

        beam_spans = []
        beam_momentofinertia=[]
        beam_elasticmodulus=[]
        beam_loads_raw = []
        dead = []
        seismic_x = []
        seismic_y = []
        fluid = []
        earth = []
        live = []
        live_roof = []
        rain = []
        snow = []
        wind_x = []
        wind_y = []
        cant = []
        Main_window.load_exist = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]


        i=0
        for line in beam_info_raw:

            if i<5:
                p = line.split(',')
                for items in p:
                    if i==1:
                        beam_spans.append(items.rstrip('\n'))
                    elif i==2:
                        beam_momentofinertia.append(items.rstrip('\n'))
                    elif i==3:
                        beam_elasticmodulus.append(items.rstrip('\n'))
                    elif i==4:
                        cant.append(items.rstrip('\n'))
                    else:
                        pass
            elif i>7:
                p = line.split(',')
                holder=[]
                if p[4]=="POINT":
                    holder.append(float(p[0])*1000)
                    holder.append(float(p[1])*1000)
                elif p[4]=="M":
                    holder.append(float(p[0])*1000*12)
                    holder.append(float(p[1])*1000*12)
                else:
                    holder.append(float(p[0])*1000/12)
                    holder.append(float(p[1])*1000/12)


                holder.append(float(p[2])*12)
                #holder.append((float(p[3])-float(p[2]))*12)
                holder.append((float(p[3]))*12)
                holder.append(p[4])
                holder.append(int(p[5].replace('\n',''))-1)
                holder.append(int(p[7].replace('\n','')))
                # load_types = ['D', 'Ex', 'Ey', 'F', 'H', 'L', 'Lr', 'R', 'S', 'Wx', 'Wy']
                if p[6].replace('\n','') == 'D':
                    dead.append(holder)
                    Main_window.load_exist[0]=1
                elif p[6].replace('\n','') == 'Ex':
                    seismic_x.append(holder)
                    Main_window.load_exist[1]=1
                elif p[6].replace('\n','') == 'Ey':
                    seismic_y.append(holder)
                    Main_window.load_exist[2]=1
                elif p[6].replace('\n','') == 'F':
                    fluid.append(holder)
                    Main_window.load_exist[3]=1
                elif p[6].replace('\n','') == 'H':
                    earth.append(holder)
                    Main_window.load_exist[4]=1
                elif p[6].replace('\n','') == 'L':
                    live.append(holder)
                    Main_window.load_exist[5]=1
                elif p[6].replace('\n','') == 'Lr':
                    live_roof.append(holder)
                    Main_window.load_exist[6]=1
                elif p[6].replace('\n','') == 'R':
                    rain.append(holder)
                    Main_window.load_exist[7]=1
                elif p[6].replace('\n','') == 'S':
                    snow.append(holder)
                    Main_window.load_exist[8]=1
                elif p[6].replace('\n','') == 'Wx':
                    wind_x.append(holder)
                    Main_window.load_exist[9]=1
                elif p[6].replace('\n','') == 'Wy':
                    wind_y.append(holder)
                    Main_window.load_exist[10]=1
                else:
                    print 'no load kind'
            else:
                pass

            i+=1
        del beam_spans[0]
        del beam_momentofinertia[0]
        del beam_elasticmodulus[0]
        del cant[0]
        i=0
        loads = [([0]*8) for i in range(11)]
        load_types = ['D', 'Ex', 'Ey', 'F', 'H', 'L', 'Lr', 'R', 'S', 'Wx', 'Wy']
        applied_loads = [dead, seismic_x, seismic_y, fluid, earth, live, live_roof, rain, snow, wind_x, wind_y]

        i=0
        for i in range(0, 11):
            loads[i][0] = load_types[i]
            loads[i][1] = applied_loads[i]

        beam_spans = [float(x)*12 for x in beam_spans]
        beam_momentofinertia=[float(x) for x in beam_momentofinertia]
        beam_elasticmodulus=[float(x)*1000 for x in beam_elasticmodulus]

        E = beam_elasticmodulus[0]
        #iters = max(int(round(max(beam_spans)/1.0)),500)
        iters = 25
        Main_window.stations = iters
        N = len(beam_spans)
        displace_loads = [0]*(N+1)
        displace_initial = []
        Main_window.displace_initial_results = [0]*6
        for widget in self.displace_widget:
            displace_initial.append(float(widget.get()))
        patterns = load_pattern(N)
        Main_window.pats = patterns
        Main_window.live_deflection_goal = []
        Main_window.total_deflection_goal = []
        pattern_loads = []
        no_pattern_loads = []       
        for y in range(0,4):
            pattern_loads.append([])
            no_pattern_loads.append([])
        for y in range(0,4):
            for i in range(0,N):
                pattern_loads[y].append([])

        pattern_loads_apply = [[0]*len(patterns),[0]*len(patterns),[0]*len(patterns),[0]*len(patterns)]

        
        for i in range(5,9):
            for applied in loads[i][1]:
                index = applied[5]
                if applied[6] == 1:
                    if applied == '':
                        pattern_loads[i-5][index].append(0)
                    else:
                        pattern_loads[i-5][index].append(applied)
                else:
                    no_pattern_loads[i-5].append(applied)
                    
            loads[i][1] = [no_pattern_loads[i-5],pattern_loads[i-5]]
            for y in range(2,8):
                loads[i][y] = [[0],[0]*len(patterns)]

            for z in range(0,len(patterns)):

                pat_holder = []
                for a in range(0,len(patterns[z])):
                    if i == 8:
                        
                        if patterns[z][a] == 1:
                            if len(loads[i][1][1][a]) == 0:
                                pat_holder.append([0.00,0.00,0.00,0.00,'POINT',0,0])
                            else:
                                for load in loads[i][1][1][a]:
                                    pat_holder.append(load)
                        else:
                            if len(loads[i][1][1][a]) == 0:
                                pat_holder.append([0.00,0.00,0.00,0.00,'POINT',0,0])
                            else:
                                for load in loads[i][1][1][a]:
                                    pat_holder.append([load[0]*0.5,load[1]*0.5,load[2],load[3],load[4],load[5],load[6]])
                    else:
                        if patterns[z][a] == 1:
                            if len(loads[i][1][1][a]) == 0:
                                pat_holder.append([0.00,0.00,0.00,0.00,'POINT',0,0])
                            else:
                                for load in loads[i][1][1][a]:
                                    pat_holder.append(load)
                        else:
                            pass
                pattern_loads_apply[i-5][z] = pat_holder
        for span in beam_spans:
            Main_window.live_deflection_goal.append(span/360)
            Main_window.total_deflection_goal.append(span/240)
            
        startt = time.time()
        print 'Perform analysis for all load types defined....'
        for i in range(0,11):
            if i in range(5,9):
                if len(loads[i][1][0]) == 0:
                    pass
                else:
                    Main_window.xs,loads[i][2][0],loads[i][3][0],loads[i][4][0],loads[i][5][0], loads[i][6][0], loads[i][7][0] = three_moment_method(beam_spans, beam_momentofinertia, cant, loads[i][1][0], E, iters, displace_loads)
                
                if len(loads[i][1][1]) == 0:
                    for y in range(0,len(patterns)):
                        loads[i][2][1][y] = 0.0
                        loads[i][3][1][y] = 0.0
                        loads[i][4][1][y] = 0.0
                        loads[i][5][1][y] = 0.0
                        loads[i][6][1][y] = 0.0
                        loads[i][7][1][y] = 0.0
                else:
                    for y in range(0,len(patterns)):
                        Main_window.xs, loads[i][2][1][y], loads[i][3][1][y],  loads[i][4][1][y], loads[i][5][1][y], loads[i][6][1][y], loads[i][7][1][y] = three_moment_method(beam_spans, beam_momentofinertia, cant, pattern_loads_apply[i-5][y], E, iters, displace_loads)
                        
            elif len(loads[i][1]) == 0:
                pass
            
            else:
                Main_window.xs,loads[i][2],loads[i][3],loads[i][4],loads[i][5], loads[i][6], loads[i][7] = three_moment_method(beam_spans, beam_momentofinertia, cant, loads[i][1], E, iters, displace_loads)
        
        #solve for prescribed displacements
        Main_window.xs,Main_window.displace_initial_results[0],Main_window.displace_initial_results[1],Main_window.displace_initial_results[2],Main_window.displace_initial_results[3], Main_window.displace_initial_results[4], Main_window.displace_initial_results[5] = three_moment_method(beam_spans, beam_momentofinertia, cant, [[0.00,0.00,0.00,0.00,'POINT',0,0]], E, iters, displace_initial)
        
        endt = time.time()
        print '**Analysis Complete** in {0:.4f} sec'.format(endt-startt)
        
        Main_window.load_results = loads
        Main_window.bm = np.zeros((iters+1,N))
        # # ['D', 'Ex', 'Ey', 'F', 'H', 'L', 'Lr', 'R', 'S', 'Wx', 'Wy']
        # # data structure for each non patterned load type [['D'],[loads],[shears],[moments],[slopes],[deflections],[Support Reactions],[Moments at supports]]

        print 'Factoring Loads and Generating Graphs...'

        fi = float(self.fi_lrfd.get())
        fy = float(self.fy_lrfd.get())
        
        Main_window.LRFD_factors = [[1.4, 0.0, 0.0, 1.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 1.6, 0.5, 0.0, 0.0, 0.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 1.6, 0.0, 0.5, 0.0, 0.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 1.6, 0.0, 0.0, 0.5, 0.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 1.6, 0.0, 0.0, 0.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 0.0, 1.6, 0.0, 0.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 0.0, 0.0, 1.6, 0.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 0.0, 1.6, 0.0, 0.0, 0.5, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 0.0, 0.0, 1.6, 0.0, 0.5, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 0.0, 0.0, 0.0, 1.6, 0.5, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 0.0, 1.6, 0.0, 0.0, 0.0, 0.5],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 0.0, 0.0, 1.6, 0.0, 0.0, 0.5],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, 0.0, 0.0, 0.0, 1.6, 0.0, 0.5],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 0.5, 0.0, 0.0, 1.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 0.0, 0.5, 0.0, 1.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 0.0, 0.0, 0.5, 1.0, 0.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 0.5, 0.0, 0.0, 0.0, 1.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 0.0, 0.5, 0.0, 0.0, 1.0],
                                             [1.2, 0.0, 0.0, 1.2, 1.6, fi, 0.0, 0.0, 0.5, 0.0, 1.0],
                                             [1.2, 1.0, 0.0, 1.2, 1.6, fi, 0.0, 0.0, fy, 0.0, 0.0],
                                             [1.2, 0.0, 1.0, 1.2, 1.6, fi, 0.0, 0.0, fy, 0.0, 0.0],
                                             [0.9, 0.0, 0.0, 0.0, 1.6, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0],
                                             [0.9, 0.0, 0.0, 0.0, 1.6, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
                                             [0.9, 1.0, 0.0, 0.9, 1.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                                             [0.9, 0.0, 1.0, 0.9, 1.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]

        Main_window.lrfd_combos =['IBC_16_1','IBC_16_2_Lr','IBC_16_2_R','IBC_16_2_S','IBC_16_3_f1L_Lr',
                     'IBC_16_3_f1L_R','IBC_16_3_f1L_S','IBC_16_3_Wx_Lr','IBC_16_3_Wx_R',
                     'IBC_16_3_Wx_S','IBC_16_3_Wy_Lr','IBC_16_3_Wy_R','IBC_16_3_Wy_S',
                     'IBC_16_4_Wx_Lr','IBC_16_4_Wx_R','IBC_16_4_Wx_S','IBC_16_4_Wy_Lr',
                     'IBC_16_4_Wy_R','IBC_16_4_Wy_S','IBC_16_5_Ex','IBC_16_5_Ey','IBC_16_6_Wx',
                     'IBC_16_6_Wy','IBC_16_7_Ex','IBC_16_7_Ey' ]

        Main_window.basic_factors = [[1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.75, 0.0, 0.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.0, 0.75, 0.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.0, 0.0, 0.75, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6],
                                                 [1.0, 0.70, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.70, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.75, 0.0, 0.0, (0.5*0.6), 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.0, 0.75, 0.0, (0.5*0.6), 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.0, 0.0, 0.75, (0.5*0.6), 0.0],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.75, 0.0, 0.0, 0.0, (0.5*0.6)],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.0, 0.75, 0.0, 0.0, (0.5*0.6)],
                                                 [1.0, 0.0, 0.0, 1.0, 1.0, 0.75, 0.0, 0.0, 0.75, 0.0, (0.5*0.6)],
                                                 [1.0, (0.75*0.70), 0.0, 1.0, 1.0, 0.75, 0.0, 0.0, 0.75, 0.0, 0.0],
                                                 [1.0, 0.0, (0.75*0.70), 1.0, 1.0, 0.75, 0.0, 0.0, 0.75, 0.0, 0.0],
                                                 [0.6, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.6, 0.0],
                                                 [0.6, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.6],
                                                 [0.6, 0.7, 0.0, 0.6, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
                                                 [0.6, 0.0, 0.7, 0.6, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]

        Main_window.basic_combos =['IBC_16_8','IBC_16_9','IBC_16_10_Lr',
                                     'IBC_16_10_R','IBC_16_10_S','IBC_16_11_Lr','IBC_16_11_R',
                                     'IBC_16_11_S','IBC_16_12_Wx','IBC_16_12_Wy','IBC_16_12_Ex',
                                     'IBC_16_12_Ey','IBC_16_13_Wx_Lr','IBC_16_13_Wx_R','IBC_16_13_Wx_S',
                                     'IBC_16_13_Wy_Lr','IBC_16_13_Wy_R','IBC_16_13_Wy_S','IBC_16_14_Ex','IBC_16_14_Ey',
                                     'IBC_16_15_Wx','IBC_16_15_Wy','IBC_16_16_Ex', 'IBC_16_16_Ey']


        #Factor and combine loads and Print Results to text File
        print 'LRFD Combinations...'
        Main_window.lrfd_v = []
        Main_window.lrfd_m = []
        Main_window.lrfd_r = []
        Main_window.lrfd_m_support = []
        Main_window.lrfd_v_env_min = []
        Main_window.lrfd_v_env_max = []
        Main_window.lrfd_m_env_min = []
        Main_window.lrfd_m_env_max = []
        Main_window.lrfd_r_env_min = []
        Main_window.lrfd_r_env_max = []
        Main_window.lrfd_m_support_env_min = []
        Main_window.lrfd_m_support_env_max = []
        
        for i in range(0,len(Main_window.lrfd_combos)):
            combo = Main_window.lrfd_combos[i]
            v_diag = np.zeros((iters+1, N)) + Main_window.displace_initial_results[0]
            m_diag = np.zeros((iters+1, N)) + Main_window.displace_initial_results[1]
            r = np.zeros((N+1,1)) + Main_window.displace_initial_results[4]
            m = np.zeros((N+1,1)) + Main_window.displace_initial_results[5]
            v_diag_pattern=[]
            m_diag_pattern=[]
            r_pattern=[]
            m_pattern=[]
            for pat in range(0,len(patterns)):
                v_diag_pattern.append(np.zeros((iters+1, N)))
                m_diag_pattern.append(np.zeros((iters+1, N)))
                r_pattern.append(np.zeros((N+1,1)))
                m_pattern.append(np.zeros((N+1,1)))
            for y in range(0,len(Main_window.LRFD_factors[i])):
                if y in range(5,9) and Main_window.LRFD_factors[i][y] != 0.0:

                    if len(loads[y][2][0]) <= 1:
                        pass
                    else:
                        v_diag = v_diag + (loads[y][2][0]*Main_window.LRFD_factors[i][y])
                        m_diag = m_diag + (loads[y][3][0]*Main_window.LRFD_factors[i][y])
                    
                        r = r + (loads[y][6][0]*Main_window.LRFD_factors[i][y])
                        m = m + (loads[y][7][0]*Main_window.LRFD_factors[i][y])

                    for z in range(0,len(patterns)):
                        v_diag_pattern[z] = (loads[y][2][1][z]*Main_window.LRFD_factors[i][y]) + v_diag_pattern[z]
                        m_diag_pattern[z] = (loads[y][3][1][z]*Main_window.LRFD_factors[i][y]) + m_diag_pattern[z]
                        r_pattern[z] = (loads[y][6][1][z]*Main_window.LRFD_factors[i][y]) + r_pattern[z]
                        m_pattern[z] = (loads[y][7][1][z]*Main_window.LRFD_factors[i][y]) + m_pattern[z]
                            
                elif y in range(5,9):
                    pass
                else:
                    if type(loads[y][2]) == type(v_diag):
                        v_diag = v_diag + (loads[y][2]*Main_window.LRFD_factors[i][y])
                        m_diag = m_diag + (loads[y][3]*Main_window.LRFD_factors[i][y])
                  
                        r = r + (loads[y][6]*Main_window.LRFD_factors[i][y])
                        m = m + (loads[y][7]*Main_window.LRFD_factors[i][y])
                    else:
                        pass
                        
            for z in range(0,len(patterns)):
                v_diag_pattern[z] = v_diag_pattern[z] + v_diag
                m_diag_pattern[z] = m_diag_pattern[z] + m_diag
                r_pattern[z] = r + r_pattern[z]
                m_pattern[z] = m + m_pattern[z]

            Main_window.lrfd_v.append([v_diag,v_diag_pattern])
            Main_window.lrfd_m.append([m_diag,m_diag_pattern])
            Main_window.lrfd_r.append([r,r_pattern])
            Main_window.lrfd_m_support.append([m,m_pattern])
            Main_window.lrfd_v_env_min.append(np.minimum.reduce(v_diag_pattern))
            Main_window.lrfd_v_env_max.append(np.maximum.reduce(v_diag_pattern))
            Main_window.lrfd_m_env_min.append(np.minimum.reduce(m_diag_pattern))
            Main_window.lrfd_m_env_max.append(np.maximum.reduce(m_diag_pattern))
            Main_window.lrfd_r_env_min.append(np.minimum.reduce(r_pattern))
            Main_window.lrfd_r_env_max.append(np.maximum.reduce(r_pattern))
            Main_window.lrfd_m_support_env_min.append(np.minimum.reduce(m_pattern))
            Main_window.lrfd_m_support_env_max.append(np.maximum.reduce(m_pattern))

        print 'ASD/BASIC Combinations...'
        Main_window.basic_v = []
        Main_window.basic_m = []
        Main_window.basic_s = []
        Main_window.basic_d = []
        Main_window.basic_r = []
        Main_window.basic_m_support = []
        Main_window.basic_v_env_max = []
        Main_window.basic_m_env_max = []
        Main_window.basic_s_env_max = []
        Main_window.basic_d_env_max = []
        Main_window.basic_r_env_max = []
        Main_window.basic_m_support_env_max = [] 
        Main_window.basic_v_env_min = []
        Main_window.basic_m_env_min = []
        Main_window.basic_s_env_min = []
        Main_window.basic_d_env_min = []
        Main_window.basic_r_env_min = []
        Main_window.basic_m_support_env_min = []  
        
        for i in range(0,len(Main_window.basic_combos)):
            combo = Main_window.basic_combos[i]
            v_diag = np.zeros((iters+1, N)) + Main_window.displace_initial_results[0]
            m_diag = np.zeros((iters+1, N)) + Main_window.displace_initial_results[1]
            s_diag = np.zeros((iters+1, N)) + Main_window.displace_initial_results[2]
            d_diag = np.zeros((iters+1, N)) + Main_window.displace_initial_results[3]
            r = np.zeros((N+1,1)) + Main_window.displace_initial_results[4]
            m = np.zeros((N+1,1)) + Main_window.displace_initial_results[5]
            v_diag_pattern=[]
            m_diag_pattern=[]
            s_diag_pattern=[]
            d_diag_pattern=[]
            r_pattern=[]
            m_pattern=[]
            for pat in range(0,len(patterns)):
                v_diag_pattern.append(np.zeros((iters+1, N)))
                m_diag_pattern.append(np.zeros((iters+1, N)))
                s_diag_pattern.append(np.zeros((iters+1, N)))
                d_diag_pattern.append(np.zeros((iters+1, N)))
                r_pattern.append(np.zeros((N+1,1)))
                m_pattern.append(np.zeros((N+1,1)))
            for y in range(0,len(Main_window.basic_factors[i])):
                if y in range(5,9) and Main_window.basic_factors[i][y] != 0.0:
                    if len(loads[y][2][0]) <= 1:                        
                        pass
                    else:
                        v_diag = v_diag + (loads[y][2][0]*Main_window.basic_factors[i][y])
                        m_diag = m_diag + (loads[y][3][0]*Main_window.basic_factors[i][y])
                        s_diag = s_diag + (loads[y][4][0]*Main_window.basic_factors[i][y])
                        d_diag = d_diag + (loads[y][5][0]*Main_window.basic_factors[i][y])
                    
                        r = r + (loads[y][6][0]*Main_window.basic_factors[i][y])
                        m = m + (loads[y][7][0]*Main_window.basic_factors[i][y])

                    for z in range(0,len(patterns)):
                        v_diag_pattern[z] = (loads[y][2][1][z]*Main_window.basic_factors[i][y]) + v_diag_pattern[z]
                        m_diag_pattern[z] = (loads[y][3][1][z]*Main_window.basic_factors[i][y]) + m_diag_pattern[z]
                        s_diag_pattern[z] = (loads[y][4][1][z]*Main_window.basic_factors[i][y]) + s_diag_pattern[z]
                        d_diag_pattern[z] = (loads[y][5][1][z]*Main_window.basic_factors[i][y]) + d_diag_pattern[z]
                        r_pattern[z] = (loads[y][6][1][z]*Main_window.basic_factors[i][y]) + r_pattern[z]
                        m_pattern[z] = (loads[y][7][1][z]*Main_window.basic_factors[i][y]) + m_pattern[z]
                            
                elif y in range(5,9):
                    pass
                else:
                    if type(loads[y][2]) == type(v_diag):
                        v_diag = v_diag + (loads[y][2]*Main_window.basic_factors[i][y])
                        m_diag = m_diag + (loads[y][3]*Main_window.basic_factors[i][y])
                        s_diag = s_diag + (loads[y][4]*Main_window.basic_factors[i][y])
                        d_diag = d_diag + (loads[y][5]*Main_window.basic_factors[i][y])
                    
                        r = r + (loads[y][6]*Main_window.basic_factors[i][y])
                        m = m + (loads[y][7]*Main_window.basic_factors[i][y])
                    else:
                        pass
                        
            for z in range(0,len(patterns)):
                v_diag_pattern[z] = v_diag + v_diag_pattern[z]
                m_diag_pattern[z] = m_diag + m_diag_pattern[z]
                s_diag_pattern[z] = s_diag + s_diag_pattern[z]
                d_diag_pattern[z] = d_diag + d_diag_pattern[z]
                r_pattern[z] = r + r_pattern[z]
                m_pattern[z] = m + m_pattern[z]

            Main_window.basic_v.append([v_diag,v_diag_pattern])
            Main_window.basic_m.append([m_diag,m_diag_pattern])
            Main_window.basic_s.append([s_diag,s_diag_pattern])
            Main_window.basic_d.append([d_diag,d_diag_pattern])
            Main_window.basic_r.append([r,r_pattern])
            Main_window.basic_m_support.append([m,m_pattern])
            Main_window.basic_v_env_max.append(np.maximum.reduce(v_diag_pattern))
            Main_window.basic_m_env_max.append(np.maximum.reduce(m_diag_pattern))
            Main_window.basic_s_env_max.append(np.maximum.reduce(s_diag_pattern))
            Main_window.basic_d_env_max.append(np.maximum.reduce(d_diag_pattern))
            Main_window.basic_r_env_max.append(np.maximum.reduce(r_pattern))
            Main_window.basic_m_support_env_max.append(np.maximum.reduce(m_pattern))
            Main_window.basic_v_env_min.append(np.minimum.reduce(v_diag_pattern))
            Main_window.basic_m_env_min.append(np.minimum.reduce(m_diag_pattern))
            Main_window.basic_s_env_min.append(np.minimum.reduce(s_diag_pattern))
            Main_window.basic_d_env_min.append(np.minimum.reduce(d_diag_pattern))
            Main_window.basic_r_env_min.append(np.minimum.reduce(r_pattern))
            Main_window.basic_m_support_env_min.append(np.minimum.reduce(m_pattern))
        
        print 'Enveloping Results...'

        Main_window.lrfd_Rmax_print = np.maximum.reduce(Main_window.lrfd_r_env_max)
        Main_window.lrfd_Rmin_print = np.minimum.reduce(Main_window.lrfd_r_env_min)
        Main_window.lrfd_Mmax_print = np.maximum.reduce(Main_window.lrfd_m_support_env_max)
        Main_window.lrfd_Mmin_print = np.minimum.reduce(Main_window.lrfd_m_support_env_min)
        Main_window.asd_Rmax_print = np.maximum.reduce(Main_window.basic_r_env_max)
        Main_window.asd_Rmin_print = np.minimum.reduce(Main_window.basic_r_env_min)
        Main_window.asd_Mmax_print = np.maximum.reduce(Main_window.basic_m_support_env_max)
        Main_window.asd_Mmin_print = np.minimum.reduce(Main_window.basic_m_support_env_min)
        
        Main_window.lrfd_v_max_diag = np.maximum.reduce(Main_window.lrfd_v_env_max)
        Main_window.lrfd_v_min_diag = np.minimum.reduce(Main_window.lrfd_v_env_min)
        Main_window.lrfd_m_max_diag = np.maximum.reduce(Main_window.lrfd_m_env_max)
        Main_window.lrfd_m_min_diag = np.minimum.reduce(Main_window.lrfd_m_env_min)

        Main_window.asd_v_max_diag = np.maximum.reduce(Main_window.basic_v_env_max)
        Main_window.asd_v_min_diag = np.minimum.reduce(Main_window.basic_v_env_min)
        Main_window.asd_m_max_diag = np.maximum.reduce(Main_window.basic_m_env_max)
        Main_window.asd_m_min_diag = np.minimum.reduce(Main_window.basic_m_env_min)
        Main_window.asd_s_max_diag = np.maximum.reduce(Main_window.basic_s_env_max)
        Main_window.asd_s_min_diag = np.minimum.reduce(Main_window.basic_s_env_min)
        Main_window.asd_d_max_diag = np.maximum.reduce(Main_window.basic_d_env_max)
        Main_window.asd_d_min_diag = np.minimum.reduce(Main_window.basic_d_env_min)
        
        #Create CSV file of LRFD Envelope Results
        print 'Writing CSV Files...'
        file = open(os.path.join(path,bmlabel+'_04_LRFD_Envelope_Results.csv'),'w')
        file.write('LRFD Envelope Results\n')
        file.write('Spans:,'+str(N))
        file.write('\nStations:,'+str(iters))
        file.write('\nspan,x_local (ft), x_global (ft),V_min (kips),V_max (kips),M_min (ft-kips),M_max (ft-kips)\n')
        for j in range(0,N):
            for k in range(0,iters+1):
                if j ==0:
                    file.write('{0},{1:.6f},{2:.6f},{3:.6f},{4:.6f},{5:.6f},{6:.6f}\n'.format(j+1,Main_window.xs[k,j], Main_window.xs[k,j], Main_window.lrfd_v_min_diag[k,j], Main_window.lrfd_v_max_diag[k,j], Main_window.lrfd_m_min_diag[k,j], Main_window.lrfd_m_max_diag[k,j]))
                else:
                    file.write('{0},{1:.6f},{2:.6f},{3:.6f},{4:.6f},{5:.6f},{6:.6f}\n'.format(j+1,(Main_window.xs[k,j]-Main_window.xs[-1,j-1]), Main_window.xs[k,j], Main_window.lrfd_v_min_diag[k,j], Main_window.lrfd_v_max_diag[k,j], Main_window.lrfd_m_min_diag[k,j], Main_window.lrfd_m_max_diag[k,j]))
        file.close()
        
        #Create CSV file of ASD Envelope Results
        file = open(os.path.join(path,bmlabel+'_05_ASD_Envelope_Results.csv'),'w')
        file.write('ASD Envelope Results\n')
        file.write('Spans:,'+str(N))
        file.write('\nStations:,'+str(iters))
        file.write('\nspan,x_local (ft),x_global (ft),V_min (kips),V_max (kips),M_min (ft-kips),M_max (ft-kips),d_min (in),d_max (in)\n')
        for j in range(0,N):
            for k in range(0,iters+1):
                if j==0:
                    file.write('{0:.6f},{1:.6f},{2:.6f},{3:.6f},{4:.6f},{5:.6f},{6:.6f},{7:.6f},{8:.6f}\n'.format(j+1,Main_window.xs[k,j], Main_window.xs[k,j], Main_window.asd_v_min_diag[k,j], Main_window.asd_v_max_diag[k,j], Main_window.asd_m_min_diag[k,j], Main_window.asd_m_max_diag[k,j], Main_window.asd_d_min_diag[k,j], Main_window.asd_d_max_diag[k,j]))
                else:
                    file.write('{0:.6f},{1:.6f},{2:.6f},{3:.6f},{4:.6f},{5:.6f},{6:.6f},{7:.6f},{8:.6f}\n'.format(j+1,(Main_window.xs[k,j]-Main_window.xs[-1,j-1]), Main_window.xs[k,j], Main_window.asd_v_min_diag[k,j], Main_window.asd_v_max_diag[k,j], Main_window.asd_m_min_diag[k,j], Main_window.asd_m_max_diag[k,j], Main_window.asd_d_min_diag[k,j], Main_window.asd_d_max_diag[k,j]))
        file.close()
        
        #Create CSV file of ASD Envelope Results
        file = open(os.path.join(path,bmlabel+'_05_ASD_Envelope_Results.csv'),'w')
        file.write('ASD Envelope Results\n')
        file.write('Spans:,'+str(N))
        file.write('\nStations:,'+str(iters))
        file.write('\nspan,x_local (ft),x_global (ft),V_min (kips),V_max (kips),M_min (ft-kips),M_max (ft-kips),d_min (in),d_max (in)\n')
        for j in range(0,N):
            for k in range(0,iters+1):
                if j==0:
                    file.write('{0:.6f},{1:.6f},{2:.6f},{3:.6f},{4:.6f},{5:.6f},{6:.6f},{7:.6f},{8:.6f}\n'.format(j+1,Main_window.xs[k,j], Main_window.xs[k,j], Main_window.asd_v_min_diag[k,j], Main_window.asd_v_max_diag[k,j], Main_window.asd_m_min_diag[k,j], Main_window.asd_m_max_diag[k,j], Main_window.asd_d_min_diag[k,j], Main_window.asd_d_max_diag[k,j]))
                else:
                    file.write('{0:.6f},{1:.6f},{2:.6f},{3:.6f},{4:.6f},{5:.6f},{6:.6f},{7:.6f},{8:.6f}\n'.format(j+1,(Main_window.xs[k,j]-Main_window.xs[-1,j-1]), Main_window.xs[k,j], Main_window.asd_v_min_diag[k,j], Main_window.asd_v_max_diag[k,j], Main_window.asd_m_min_diag[k,j], Main_window.asd_m_max_diag[k,j], Main_window.asd_d_min_diag[k,j], Main_window.asd_d_max_diag[k,j]))
        file.close()
        
        cad_points = iters
        #Create DXF of Envelope Results
        print 'Creating DXF of Results ...'
        file = open(os.path.join(path,bmlabel+'_02_Envelope_Results.dxf'),'w')
        file.write('  0\nSECTION\n  2\nENTITIES\n')
        file.write('  0\nPOLYLINE\n  8\nspans\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            file.write('  0\nVERTEX\n  8\nspans\n 10\n{0:.3f}\n 20\n0.0\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)))
            file.write('  0\nVERTEX\n  8\nspans\n 10\n{0:.3f}\n 20\n0.0\n 30\n0.0\n'.format((Main_window.xs[-1,j]*12)))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            file.write('  0\nPOLYLINE\n 62\n16\n  8\nspans\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nspans\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),Main_window.lrfd_m_min_diag.min()))
            file.write('  0\nVERTEX\n  8\nspans\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),Main_window.lrfd_m_max_diag.max()))
            file.write('  0\nSEQEND\n')
        if cant[0] == 'L' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n2\n  8\nsupports\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),0.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)-5,-10.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)+5,-10.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),0.0))
            file.write('  0\nSEQEND\n')
        for j in range(1,N):
            file.write('  0\nPOLYLINE\n 62\n2\n  8\nsupports\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),0.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)-5,-10.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)+5,-10.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),0.0))
            file.write('  0\nSEQEND\n')
        file.write('  0\nPOLYLINE\n 62\n16\n  8\nspans\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        file.write('  0\nVERTEX\n  8\nspans\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),Main_window.lrfd_m_min_diag.min()))
        file.write('  0\nVERTEX\n  8\nspans\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),Main_window.lrfd_m_max_diag.max()))
        file.write('  0\nSEQEND\n')
        if cant[0] == 'R' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n2\n  8\nsupports\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),0.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)-5,-10.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)+5,-10.0))
            file.write('  0\nVERTEX\n  8\nsupports\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),0.0))
            file.write('  0\nSEQEND\n')

        if cant[0] == 'L' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),0.0))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0-(float(Main_window.lrfd_Rmax_print[0])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)-(float(Main_window.lrfd_Rmax_print[0])/10000),(0.0-(float(Main_window.lrfd_Rmax_print[0])/10000))))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)+(float(Main_window.lrfd_Rmax_print[0])/10000),(0.0-(float(Main_window.lrfd_Rmax_print[0])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0-(float(Main_window.lrfd_Rmax_print[0])/1000)), (float(Main_window.lrfd_Rmax_print[0])/1000)))
        for j in range(1,N):
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),0.0))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0-(float(Main_window.lrfd_Rmax_print[j])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)-(float(Main_window.lrfd_Rmax_print[j])/10000),(0.0-(float(Main_window.lrfd_Rmax_print[j])/10000))))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)+(float(Main_window.lrfd_Rmax_print[j])/10000),(0.0-(float(Main_window.lrfd_Rmax_print[j])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0-(float(Main_window.lrfd_Rmax_print[j])/1000)), (float(Main_window.lrfd_Rmax_print[j])/1000)))
        if cant[0] == 'R' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),0.0))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0-(float(Main_window.lrfd_Rmax_print[N])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)-(float(Main_window.lrfd_Rmax_print[N])/10000),(0.0-(float(Main_window.lrfd_Rmax_print[N])/10000))))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)+(float(Main_window.lrfd_Rmax_print[N])/10000),(0.0-(float(Main_window.lrfd_Rmax_print[N])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nLRFD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0-(float(Main_window.lrfd_Rmax_print[N])/1000)), (float(Main_window.lrfd_Rmax_print[N])/1000)))

        if cant[0] == 'L' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),0.0))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0-(float(Main_window.lrfd_Rmin_print[0])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)-(float(Main_window.lrfd_Rmin_print[0])/10000),(0.0-(float(Main_window.lrfd_Rmin_print[0])/10000))))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)+(float(Main_window.lrfd_Rmin_print[0])/10000),(0.0-(float(Main_window.lrfd_Rmin_print[0])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0-(float(Main_window.lrfd_Rmin_print[0])/1000)), (float(Main_window.lrfd_Rmin_print[0])/1000)))
        for j in range(1,N):
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),0.0))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0-(float(Main_window.lrfd_Rmin_print[j])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)-(float(Main_window.lrfd_Rmin_print[j])/10000),(0.0-(float(Main_window.lrfd_Rmin_print[j])/10000))))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)+(float(Main_window.lrfd_Rmin_print[j])/10000),(0.0-(float(Main_window.lrfd_Rmin_print[j])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0-(float(Main_window.lrfd_Rmin_print[j])/1000)), (float(Main_window.lrfd_Rmin_print[j])/1000)))
        if cant[0] == 'R' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),0.0))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0-(float(Main_window.lrfd_Rmin_print[N])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nLRFD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)-(float(Main_window.lrfd_Rmin_print[N])/10000),(0.0-(float(Main_window.lrfd_Rmin_print[N])/10000))))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)+(float(Main_window.lrfd_Rmin_print[N])/10000),(0.0-(float(Main_window.lrfd_Rmin_print[N])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nLRFD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0-(float(Main_window.lrfd_Rmin_print[N])/1000)), (float(Main_window.lrfd_Rmin_print[N])/1000)))

        if cant[0] == 'L' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),0.0))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0-(float(Main_window.asd_Rmax_print[0])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)-(float(Main_window.asd_Rmax_print[0])/10000),(0.0-(float(Main_window.asd_Rmax_print[0])/10000))))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)+(float(Main_window.asd_Rmax_print[0])/10000),(0.0-(float(Main_window.asd_Rmax_print[0])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0-(float(Main_window.asd_Rmax_print[0])/1000)), (float(Main_window.asd_Rmax_print[0])/1000)))
        for j in range(1,N):
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),0.0))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0-(float(Main_window.asd_Rmax_print[j])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)-(float(Main_window.asd_Rmax_print[j])/10000),(0.0-(float(Main_window.asd_Rmax_print[j])/10000))))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)+(float(Main_window.asd_Rmax_print[j])/10000),(0.0-(float(Main_window.asd_Rmax_print[j])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0-(float(Main_window.asd_Rmax_print[j])/1000)), (float(Main_window.asd_Rmax_print[j])/1000)))
        if cant[0] == 'R' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),0.0))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0-(float(Main_window.asd_Rmax_print[N])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)-(float(Main_window.asd_Rmax_print[N])/10000),(0.0-(float(Main_window.asd_Rmax_print[N])/10000))))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)+(float(Main_window.asd_Rmax_print[N])/10000),(0.0-(float(Main_window.asd_Rmax_print[N])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nASD_Reactions_Max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0-(float(Main_window.asd_Rmax_print[N])/1000)), (float(Main_window.asd_Rmax_print[N])/1000)))

        if cant[0] == 'L' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),0.0))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0-(float(Main_window.asd_Rmin_print[0])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)-(float(Main_window.asd_Rmin_print[0])/10000),(0.0-(float(Main_window.asd_Rmin_print[0])/10000))))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,0]*12)+(float(Main_window.asd_Rmin_print[0])/10000),(0.0-(float(Main_window.asd_Rmin_print[0])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[0,0]*12),(0.0-(float(Main_window.asd_Rmin_print[0])/1000)), (float(Main_window.asd_Rmin_print[0])/1000)))
        for j in range(1,N):
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),0.0))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0-(float(Main_window.asd_Rmin_print[j])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)-(float(Main_window.asd_Rmin_print[j])/10000),(0.0-(float(Main_window.asd_Rmin_print[j])/10000))))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[0,j]*12)+(float(Main_window.asd_Rmin_print[j])/10000),(0.0-(float(Main_window.asd_Rmin_print[j])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[0,j]*12),(0.0-(float(Main_window.asd_Rmin_print[j])/1000)), (float(Main_window.asd_Rmin_print[j])/1000)))
        if cant[0] == 'R' or cant[0] == 'B':
            pass
        else:
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),0.0))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0-(float(Main_window.asd_Rmin_print[N])/1000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nPOLYLINE\n 62\n8\n  8\nASD_Reactions_Min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)-(float(Main_window.asd_Rmin_print[N])/10000),(0.0-(float(Main_window.asd_Rmin_print[N])/10000))))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0)))
            file.write('  0\nVERTEX\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[-1,N-1]*12)+(float(Main_window.asd_Rmin_print[N])/10000),(0.0-(float(Main_window.asd_Rmin_print[N])/10000))))
            file.write('  0\nSEQEND\n')
            file.write('  0\nTEXT\n 62\n9\n  8\nASD_Reactions_Min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n0.0\n'.format((Main_window.xs[-1,N-1]*12),(0.0-(float(Main_window.asd_Rmin_print[N])/1000)), (float(Main_window.asd_Rmin_print[N])/1000)))


        file.write('  0\nPOLYLINE\n 62\n3\n  8\nLRFD_shear_max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nLRFD_shear_max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_v_max_diag[k,j]))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.lrfd_v_max_diag[l,j] > Main_window.lrfd_v_max_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n3\n  8\nLRFD_shear_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_v_max_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n3\n  8\nLRFD_shear_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_v_max_diag[k,j]))
        file.write('  0\nPOLYLINE\n 62\n2\n  8\nLRFD_shear_min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nLRFD_shear_min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_v_min_diag[k,j]))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.lrfd_v_min_diag[l,j] > Main_window.lrfd_v_min_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n2\n  8\nLRFD_shear_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_v_min_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n2\n  8\nLRFD_shear_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_v_min_diag[k,j]))
        file.write('  0\nPOLYLINE\n 62\n5\n  8\nLRFD_moment_max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nLRFD_moment_max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_m_max_diag[k,j]))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.lrfd_m_max_diag[l,j] > Main_window.lrfd_m_max_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n5\n  8\nLRFD_moment_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} ft-kips\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_m_max_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n5\n  8\nLRFD_moment_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} ft-kips\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_m_max_diag[k,j]))
        file.write('  0\nPOLYLINE\n 62\n4\n  8\nLRFD_moment_min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nLRFD_moment_min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_m_min_diag[k,j]))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.lrfd_m_min_diag[l,j] > Main_window.lrfd_m_min_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n4\n  8\nLRFD_moment_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} ft-kips\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_m_min_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n4\n  8\nLRFD_moment_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} ft-kips\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), Main_window.lrfd_m_min_diag[k,j]))
        #Start ASD polygon section
        file.write('  0\nPOLYLINE\n 62\n3\n  8\nASD_shear_max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nASD_shear_max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_v_max_diag[k,j]))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.asd_v_max_diag[l,j] > Main_window.asd_v_max_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n3\n  8\nASD_shear_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_v_max_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n3\n  8\nASD_shear_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_v_max_diag[k,j]))
        file.write('  0\nPOLYLINE\n 62\n2\n  8\nASD_shear_min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nASD_shear_min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_v_min_diag[k,j]))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.asd_v_min_diag[l,j] > Main_window.asd_v_min_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n2\n  8\nASD_shear_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_v_min_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n2\n  8\nASD_shear_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} kips\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_v_min_diag[k,j]))
        file.write('  0\nPOLYLINE\n 62\n5\n  8\nASD_moment_max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nASD_moment_max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_m_max_diag[k,j]))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.asd_m_max_diag[l,j] > Main_window.asd_m_max_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n5\n  8\nASD_moment_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} ft-kips\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_m_max_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n5\n  8\nASD_moment_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} ft-kips\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_m_max_diag[k,j]))
        file.write('  0\nPOLYLINE\n 62\n4\n  8\nASD_moment_min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nASD_moment_min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_m_min_diag[k,j]))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.asd_m_min_diag[l,j] > Main_window.asd_m_min_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n4\n  8\nASD_moment_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} ft-kips\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_m_min_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n4\n  8\nASD_moment_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{1:.3f} ft-kips\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_m_min_diag[k,j]))
        file.write('  0\nPOLYLINE\n 62\n6\n  8\nASD_deflection_max\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nASD_deflection_max\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_d_max_diag[k,j]*100))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.asd_d_max_diag[l,j] > Main_window.asd_d_max_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n6\n  8\nASD_deflection_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{2:.4f} in\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), (Main_window.asd_d_max_diag[k,j]*100),Main_window.asd_d_max_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n6\n  8\nASD_deflection_max_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{2:.4f} in\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), (Main_window.asd_d_max_diag[k,j]*100),Main_window.asd_d_max_diag[k,j]))
        file.write('  0\nPOLYLINE\n 62\n241\n  8\nASD_deflection_min\n 66\n1\n 10\n0.0\n 20\n0.0\n 30\n0.0\n 70\n8\n')
        for j in range(0,N):
            for z in range(0,cad_points+1):
                if z==0:
                    k=0
                else:
                    if z*(iters/(cad_points*1.00)) > iters:
                        k=iters
                    else:
                        k=int(round(z*(iters/(cad_points*1.00))))
                file.write('  0\nVERTEX\n  8\nASD_deflection_min\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n'.format((Main_window.xs[k,j]*12), Main_window.asd_d_min_diag[k,j]*100))
        file.write('  0\nSEQEND\n')
        for j in range(0,N):
            for z in range(0,5):
                if z==0:
                    k=0
                    l=k+1
                else:
                    if z*int(iters/4) >= iters:
                        k=iters
                        l=k
                    else:
                        k=z*int(iters/4)
                        l=k+1
                if Main_window.asd_d_min_diag[l,j] > Main_window.asd_d_min_diag[k,j]:
                    file.write('  0\nTEXT\n 62\n241\n  8\nASD_deflection_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{2:.4f} in\n 50\n-45.0\n'.format((Main_window.xs[k,j]*12), (Main_window.asd_d_min_diag[k,j]*100),Main_window.asd_d_min_diag[k,j]))
                else:
                    file.write('  0\nTEXT\n 62\n241\n  8\nASD_deflection_min_labels\n 10\n{0:.3f}\n 20\n{1:.3f}\n 30\n0.0\n 40\n1.0\n  1\n{2:.4f} in\n 50\n45.0\n'.format((Main_window.xs[k,j]*12), (Main_window.asd_d_min_diag[k,j]*100),Main_window.asd_d_min_diag[k,j]))
        file.write('  0\nENDSEC\n  0\nEOF')
        file.close()
        
        print 'Done!'
        self.brun.configure(bg='green')
        self.bresults.configure(state="normal", bg='green')
        self.menu.entryconfig(4, state="normal")

def main():
    root = tk.Tk()
    #root.tk_setPalette(background='gray40', foreground='gray90', activeBackground='gray20', activeForeground='green yellow')
    root.title("Continuous Beam Analysis by the 3 Moment Method")
    app = Main_window(root)
    root.minsize(1400,600)
    root.mainloop()

if __name__ == '__main__':
    main()