Quantcast
Channel: Scripting - McNeel Forum
Viewing all articles
Browse latest Browse all 5791

Function definition gives error, running code outside function works

$
0
0

Hi,

As the title says, I have a function sigmadef() that gives an error. The error is " object_2$2 is not callabe ", which google only links to Ladybug, but I’m not using that.

However, when I comment the function call and put the code from within the function directly in the script, it works fine.

Why does the same code not work within the function?

import Rhino
import rhinoscriptsyntax as rs
import scriptcontext
np = scriptcontext.sticky['numpy']
#activate=True;bar=100
#if activate:
#    
#    upper_limit = abs(bar)
#    Rhino.UI.StatusBar.ShowProgressMeter(0, upper_limit, "Python comp", True, True)
#    for i in range(upper_limit):
#        
#        rs.Sleep(10)
#        if i%10 == 0: Rhino.UI.StatusBar.UpdateProgressMeter(i, True)
#    
#    Rhino.UI.StatusBar.HideProgressMeter()

def lim(y,l,i):
    try:
        return y[l[i]]
    except IndexError:
        return -1
#return:    either y[l[i]] or -1

def geom(x,yi, diri):
    ii = []; dsdxi = []; dzdxi = []
    ii.append( [np.argmax(yi > ele) +(len(yi))*(yi[-1] <  ele) for ele in x] )
    ii = ii[0]
    dzdxi.append([-lim(diri,ii,ele[0]) for ele in enumerate(x)])
    dzdxi = dzdxi[0]
    dsdxi.append([(1+dzdxi[ele[0]]**2)**0.5 for ele in enumerate(x)])
    dsdxi = dsdxi[0]
    ia = ii
    if max([ele<0 for ele in yi]):
        ia.extend( [ele for ele, a in enumerate([not(ele>0) for ele in yi]) if a] )
    if not ( all( x in ia for x in range(len(yi)) ) ):
        print('not every brick is represented in linspace x')
        print x
        print ia
        exit()
    return ii,dsdxi,dzdxi
#return:    ii,dsdxi,dzdxi

def zero(i):
    zeros = np.zeros((i,len(x) ))
    return zeros
#return:    zeros
    
def new(l):
    n = len([l0,l1,l2][l])
    ii = [i0,i1,i2][l]
    h = h_old
    h[[i for i in range(len(ii)) if ii[i] == n]] = h_old[[i for i in range(len(ii)) if ii[i] == n]]+t
    return(h,n)
#return:    h,n

def section_forces(n,yi,Ai,dsdx,dzdx,h):
    weight = rho*9.81*t #N/m²
    y=yi[n] #m
    A=Ai[n] #m²/m¹ (Sum(l*b)/L)
    
    Vx = np.piecewise(x, [x<=y,x>y], [weight*A,0])
    M = weight*(y-x)*A
    M = [0 if ele < 0 else ele for ele in M]
    
    Vs = Vx/dsdx
    Ns = Vx*dzdx/dsdx
    
    W = 1/6 * h**2
    A = h
    return M,Vs,Ns,W,A
#return:    M,Vs,Ns,W,A

def sigmadef():
    dist = [[
        np.linspace( -1,1,int(h[j]/t+1) )[i]
        if int(h[j]/t)>=i
        else 0
        for j in range(len(x))]
        for i in range(lmax+1)]
    sigma_m = np.array(
        [[
        M[j]/W[j] *10**(-6) * dist[i][j]
        if h[j] != 0
        else 0
        if h[j]/t>=i
        else 0
        for j in range(len(x))]
        for i in range(lmax+1)] )
    sigma_n = np.array(
        [[
        Ns[j]/A[j] *10**(-6)
        * (h[j]/t>=i)
        if h[j] != 0
        else 0
        for j in range(len(x)) ]
        for i in range(lmax+1)] )
    tau =  np.array(
       [[
       Vs[j]*(6*dist[i][j]**2 - 3/2)/h[j] *10**(-6)
       if h[j] != 0
       else 0
       if h[j]/t>=i
       else 0
       for j in range(len(x)) ]
       for i in range(lmax+1)] )
    return dist,sigma_m,sigma_n, tau
#return:    dist, sigma_m, sigma_n, tau

#
                        ###Script begint hier

        ##directe bewerking input
L = L+lu    #float
[fb,fm,fvk,fti,ftf,deltax,pot,cure] = sm    #list of floats
print ("fb=",fb)
fy = fb*fm                          #####!!!!!
fyt = fti*ftf
fyv = fvk
y0 = [ele for ele in y0 if ele<L/2];    #list of floats
y1 = [ele for ele in y1 if ele<L/2]
y2 = [ele for ele in y2 if ele<L/2]
#t & rho is also one float number   A0,A1,A2,row are lists of floats

        ##output
seq=["layer;brick"]

        ##overige parameters

l0=[];l1=[0];l2=[0]; lmax=3

ymin = min(
min([j-i for i, j in zip(y0[:-1], y0[1:])]),
min([j-i for i, j in zip(y1[:-1], y1[1:])]),
min([j-i for i, j in zip(y2[:-1], y2[1:])]))
CHECK = (deltax < ymin)
if CHECK==False:
    print "Reduce deltax!"
    print ymin

x = np.arange(0,L/2,deltax)

i0,dsdx0,dzdx0 = geom(x,y0,Dir0)    #list of floats
i1,dsdx1,dzdx1 = geom(x,y1,Dir1)
i2,dsdx2,dzdx2 = geom(x,y2,Dir2)

sigma_M = zero(4); sigma_N = zero(4); Tau = zero(4)
sigma_m = zero(4); sigma_n = zero(4); tau = zero(4); dist = zero(4)
h_old = zero(1)[0]

[r1,r2,r3] = row
r1,r2,r3 = r1*pot/cure,r2*pot/cure,r3*pot/cure
r = zero(4)

for i in range(3):
#for i in range(len(y0)+len(y1)+len(y2)):
    
    l=0
    h,n = new(l)
    
    M,Vs,Ns,W,A = section_forces(n,y0,A0,dsdx0,dzdx0,h)
    dist = [[
        np.linspace( -1,1,int(h[j]/t+1) )[i]
        if int(h[j]/t)>=i
        else 0
        for j in range(len(x))]
        for i in range(lmax+1)]
    sigma_m = np.array(
        [[
        M[j]/W[j] *10**(-6) * dist[i][j]
        if h[j] != 0
        else 0
        if h[j]/t>=i
        else 0
        for j in range(len(x))]
        for i in range(lmax+1)] )
    sigma_n = np.array(
        [[
        Ns[j]/A[j] *10**(-6)
        * (h[j]/t>=i)
        if h[j] != 0
        else 0
        for j in range(len(x)) ]
        for i in range(lmax+1)] )
    tau =  np.array(
       [[
       Vs[j]*(6*dist[i][j]**2 - 3/2)/h[j] *10**(-6)
       if h[j] != 0
       else 0
       if h[j]/t>=i
       else 0
       for j in range(len(x)) ]
       for i in range(lmax+1)] )
#    AASigma = sigmadef() #Why don't you work!!??
    
    sigma = sigma_M + sigma_m + sigma_N + sigma_n
    h/t
    print seq
    print dist
    print sigma_m
    print sigma_n
    print tau
    sigma_comp = np.min(sigma[0])
    sigma_tens = np.max(sigma[1:4])
    tau_cum = np.max(Tau + tau)
    
    UC0 = max(sigma_comp/fy, sigma_tens/fyt, tau_cum/fyv)
    
    if len(l0)==len(y0):
        UC0=1.5
    print("UC0 " + str(UC0))
    print n
    
                                                                                      
                                                                                      
                                                                                      #Layer 1 (2nd)
                                                                                      
                                                                                      

    if n>0:
        print "second layer"
##    if ( UC0>((l2[-1]+3)/(len(y2)+2)) or l0[-1]-l1[-1]+1>3 ) and ( y0[l0[-1]]-lu>y1[l1[-1]] or len(l0)==len(y0) ):
#        l=1
#        n = min(l1[-1],len(y1)-1)
#        y=y1[n]
#        Aw=A1[n]
#        h[[i for i in range(len(i1)) if i1[i] == n]] = h[[i for i in range(len(i1)) if i1[i] == n]]+t
#        Vx = np.piecewise(x, [x<=y,x>y], [weight*Aw,0])
#        M = weight*(y-x)*Aw
#        M = [0 if ele < 0 else ele for ele in M]
#        Vs = Vx/dsdx1 #maakt als het goed is weinig uit welke dsdx hier staat
#        Ns = Vx*dzdx1/dsdx1
#        W = 1/6 * h**2
#        A = h
#        
#        print('M',M)
#        Mi,Vsi,Nsi,Wi,Ai = section_forces(n,y1,A1,dsdx1,dzdx1,h)
#        print(Mi,Nsi)
#        
#        dist = [[np.linspace(-1,1,int(h[j]/t+1))[i] if int(h[j]/t)>=i else 0 for j in range(len(x))] for i in range(lmax+1)]
#        sigma_m = np.array( [ [ M[j]/W[j] *10**(-6) * dist[i][j] if h[j] != 0 else 0 if h[j]/t>=i else 0 for j in range(len(x))] for i in range(lmax+1)] )
#        sigma_n = np.array([ [ Ns[j]/A[j] *10**(-6) if h[j] != 0 else 0 if h[j]/t>=i else 0 for j in range(len(x)) ] for i in range(lmax+1)] )
#        tau_max = 3/2 * Vs/t *10**(-6)
#        
#        sigma = sigma_M + sigma_m + sigma_N + sigma_n
#        sigma_comp = np.min(sigma[0])
#        sigma_tens = np.max(sigma[1:4])
#        tau_cum = np.max(Tau + tau)
#        
#        UC1 = max(sigma_comp/fy, sigma_tens/fyt, tau_cum/fyv)
#        if len(l1)==len(y1):
#            UC1=1.5
#        print("UC1 " + str(UC1))
#        
#                                                                                      #Layer 2 (3rd)
#        if ( UC1>((l2[-1]+3)/(len(y2)+2)) or l1[-1]-l2[-1]+1>3 ) and ( y1[l1[-1]]-lu>y2[l2[-1]] or len(l1)==len(y1) ):
#            l=2
#            n = min(l2[-1],len(y2)-1)
#            y=y2[n]
#            Aw=A2[n]
#            h[[i for i in range(len(i2)) if i2[i] == n]] = h[[i for i in range(len(i2)) if i2[i] == n]]+t
#            Vx = np.piecewise(x, [x<=y,x>y], [weight*Aw,0])
#            M = weight*(y-x)*Aw
#            M = [0 if ele < 0 else ele for ele in M]
#            Vs = Vx/dsdx2 #maakt als het goed is weinig uit welke dsdx hier staat
#            Ns = Vx*dzdx2/dsdx2
#            W = 1/6 * h**2
#            A = h
#            dist = [[np.linspace(-1,1,int(h[j]/t+1))[i] if int(h[j]/t)>=i else 0 for j in range(len(x))] for i in range(lmax+1)]
#            sigma_m = np.array( [ [ M[j]/W[j] *10**(-6) * dist[i][j] if h[j] != 0 else 0 if h[j]/t>=i else 0 for j in range(len(x))] for i in range(lmax+1)] )
#            sigma_n = np.array([ [ Ns[j]/A[j] *10**(-6) if h[j] != 0 else 0 if h[j]/t>=i else 0 for j in range(len(x)) ] for i in range(lmax+1)] )
#            tau_max = 3/2 * Vs/t *10**(-6)
#            
#            sigma = sigma_M + sigma_m + sigma_N + sigma_n
#            sigma_comp = np.min(sigma[0])
#            sigma_tens = np.max(sigma[1:4])
#            tau_cum = np.max(Tau + tau)
#            
#            UC2 = max(sigma_comp/fy, sigma_tens/fyt, tau_cum/fyv)
#            if len(l2)==len(y2):
#                UC2=1.5
#            print("UC2 " + str(UC2))
#            
#            if UC2>.95:
#                print("")
#                print("UC too big")
#                print("")
#                print("sigma_comp " + str(sigma_comp)); print("sigma_tens " + str(sigma_tens)); print("tau " + str(tau))
#                break
#                
#                
#            else:
#                if len(l2)<len(y2):
#                    l2.append(n+1)
#                seq.append(str(l) + ";" + str(n))
#                
#        else:
#            if len(l1)<len(y1):
#                l1.append(n+1)
#            seq.append(str(l) + ";" + str(n))
#            
    else:
        if len(l0)<len(y0):
            l0.append(n)
        seq.append(str(l) + ";" + str(n))
        
    h_old = h
    
    sigma_M = sigma_M + sigma_m #is correct sign for position on cross-section
    sigma_N = sigma_N + sigma_n #negative is correct
    tau_Cum = Tau + tau #positive is correct
    print "run one done"

print("                 end loop")
print
print ('maximum stresses:')

sigma = sigma_M + sigma_N
maxcomp = np.min(sigma[0])
maxtens = np.max(sigma[1:4])
maxshear = np.max(Tau)
print ("maxcomp: ", np.round(maxcomp,3))
print ("maxtens: ", np.round(maxtens,3))
print ("maxshear: ", np.round(maxshear,3))
print
print seq

layer = [ele.split(';')[0] for ele in seq]
brick = [ele.split(';')[1] for ele in seq]
print layer
print brick```

2 posts - 2 participants

Read full topic


Viewing all articles
Browse latest Browse all 5791

Trending Articles