import rhinoscriptsyntax as rs
import sys   
import math
import random as rand 

allobjs = rs.AllObjects()
rs.DeleteObjects (allobjs)




b_x = rand.randint(10,10)
b_y = rand.randint(10,10)
b_z = rand.randint(10,10)

# corners = [(0,0,0),(b_x,0,0),(b_x,b_y,0),(0,b_y,0),(0,0,b_z),(b_x,0,b_z),(b_x,b_y,b_z),(0,b_y,b_z)]

corners = [(0,0,0),
           (rand.randint(0,10),0,0),
           (rand.randint(0,10),rand.randint(0,10),0),
           (0,rand.randint(0,10),0),
           (0,0,b_z),
           (rand.randint(0,10),0,b_z),
           (rand.randint(0,10),rand.randint(0,10),b_z),
           (0,rand.randint(0,10),b_z)]

# rs.EnableRedraw(False)




for i in range(16):
    for j in range(1):
        for k in range(10):
            b_x = rand.randint(10,10)
            b_y = rand.randint(10,10)
            b_z = rand.randint(10,10)
            dist = 1
            b_base = 10
            offset_x = b_base + 1
            offset_y = b_base + 1
            offset_z = b_base + 1

            corners = [(0,0,0),(b_x,0,0),(b_x,b_y,0),(0,b_y,0),(0,0,b_z),(b_x,0,b_z),(b_x,b_y,b_z),(0,b_y,b_z)]
            # if not ((2 < i <= 4) or ( 2 < j <= 4) or (2 < k <= 4)):
            # if (i%2 and j%2 and k%2): # %3 oder %4
            # if 0:
            if not ((i+j)%5): 

                box = rs.AddBox(corners)
                rs.MoveObjects(box, (offset_x*i,offset_y*j,offset_z*k))
                
            elif (k>6):
                
                box = rs.AddBox(corners)
                rs.MoveObjects(box, (offset_x*i,offset_y*j,offset_z*k))
           
           
            elif  k == 5 and j == 1 and i == 1:
                
                b_a = rand.randint(20,20)
                b_b = rand.randint(20,20)
                b_c = rand.randint(20,20)
                
                corners_2 = [(0,0,0),(b_a,0,0),(b_a,b_b,0),(0,b_b,0),(0,0,b_c),(b_a,0,b_c),(b_a,b_b,b_c),(0,b_b,b_c)]
                
                box = rs.AddBox(corners_2)
                # print(box)
                rs.MoveObjects(box, (offset_x*i,offset_y*j,offset_z*k))
                rs.ObjectColor(box, (255,255,0))




'''
roopNum = 10
originPt = [0.0, 0.0, 0.0]

for i in range(roopNum):

    if(i == 0):
        fn1 = 0  #the initial term of Fibonacci number
        fn  = 1  #the first term of Fibonacci number
    else:
        fn = fn1 + fn0 #Fibonacci progression

    #Print Fibonacci Num
    print  fn

    #Drawing Recrangle
    rs.AddPoint(originPt)
    rec = rs.AddRectangle(originPt, fn, fn)
    rec = rs.RotateObject(rec, originPt, 90.0*i)
    #Drawing Arc
    # arc = rs.AddArc(originPt, fn, 90.0)
    # arc = rs.RotateObject(arc, originPt, 90.0*i)

    fn0 = fn1 #Replacement of data for next step (f0)
    fn1 = fn #Replacement of data for next step (f1)



# ---------------- Fibonacci Spirale ------------------------------------




roopNum = 20
originPt = [0.0, 0.0, 0.0]
originPt_x = 0
originPt_y = 0

for i in range(roopNum):

    if(i == 0):
        fn0 = 0
        fn1 = 0  #the initial term of Fibonacci number
        fn  = 1  #the first term of Fibonacci number
    else:
        fn = fn1 + fn0 #Fibonacci progression

    rs.AddPoint(originPt)
    # move_pt = [(0,0),(0,0),(1,0),(1,1),(-1,1),(-1,-2),(4,-2),(4,6),(-9,6),(-9,-15)]

    # get the quater
    origin_qt = round(math.sin(math.radians(90*i+45)))
    # reverse for first two quaters
    origin_qt *= -1

    # mit move

    if(i > 1):
        if i%2:
            originPt_y += fn0*origin_qt
        else:
            originPt_x += fn0*origin_qt


    # print("(" + str(fn0) + "," + str(fn1) + " -- " + str(move_pt[i]))
    originPt = [originPt_x,originPt_y,0]

    #Drawing Arc
    arc = rs.AddArc(originPt, fn, 90.0)
    arc = rs.RotateObject(arc, originPt, 90.0*i)

    #Drawing Recrangle
    rec = rs.AddRectangle(originPt, fn, fn)
    rec = rs.RotateObject(rec, originPt, 90.0*i)

    #Drawing Box
    bsize = fn
    ysize = fn
    xsize= fn                   # side length of box
    dist = 0                    # distance between boxes
    offs = bsize + dist         # offset of boxes

    corners = [(0,0,0), (bsize,0,0), (bsize,ysize,0), (0,ysize,0),(0,0,xsize),(bsize,0,xsize),(bsize,ysize,xsize),(0,ysize,xsize)]
    box = rs.AddBox(corners)
    rs.MoveObject(box, (originPt))
    rs.RotateObject(box, originPt, 90.0*i)

    # print("winkel: " + str(90*i+45) + " sin " + str(round(math.sin(math.radians(90*i+45)))))

    fn0 = fn1 #Replacement of data for next step (f0)
    fn1 = fn #Replacement of data for next step (f1)
    

    # ---------- Greek Meander ---------------------------------


# meander_pt = [(0,0), (0,4), (4,4), (4,1), (2,1), (2,2), (3,2), (3,3), (1,3), (1,0), (4,0)]
'''
'''
def meander():
    meander_pt = [(0,0), (0,4), (4,4), (4,1), (2,1), (2,2), (3,2), (3,3), (1,3), (1,0), (5,0), (5,5), (-1,5), (-1,0), (0,0)]

    meander = rs.AddPolyline(meander_pt)
    path = rs.AddLine([0,0,0], [0,0,4])
    meander_obj = rs.ExtrudeCurve( meander, path)

    rs.CapPlanarHoles(meander_obj)
    # print(meander_obj)
    # rs.MoveObject(meander_obj, (0,0,1))
    return meander_obj

for x in range(1,10):
    for y in range(1,10):
        # von zwei bis acht lasse ich ein fester aus 
        if not(2 < x < 8 and 2 < y < 8):
            # an die entsprechende stelle verschoben 
            rs.MoveObject(meander(), (x*(6+1), y*(6+1), 0))
'''
'''
# ---------------- Archimedische Spirale --------------------------

n = 20                      #groesse der spirale & Anzahl der Punkte 
width_var = 3               #breite
curve_pt_var = []

for n in range(n+1):
    t = (math.pi/4) * n
    
    #punkte werden berechnet
    x = (1 + width_var * t) * math.cos(t)
    y = (1 + width_var * t) * math.sin(t)
    
    
    point = (x,y)
    rs.AddPoint(point)          #ich zeichne ein kruve aus punkten
    curve_pt_var.append(point)

rs.AddCurve(curve_pt_var, 2)
'''
'''

# ----------------- Fermat Spirale ----------------------------------

s = 137.508

for n in range(0,500):
    t = math.sqrt(n)
    g = n * s
    z = rs.Polar([0,0,0],g,t)   #vom zenturm ausgehend 0 in richtung g und t
    rs.AddCircle(z,0.3)         #durchmesser 0,3
    
    
    
    # ----------------- Fermat Spirale ----------------------------------

# spirale extrudiern 
s = 137.508

for n in range(0,500):
    t = math.sqrt(n)
    g = n * s
    z = rs.Polar([0,0,0],g,t)                            #vom zenturm ausgehend 0 in richtung g und t
    circle = rs.AddCircle(z,0.5)                         #durchmesser 0,3
    path = rs.AddLine([0,0,0], [0,0,4])
    rs.ExtrudeCurve(circle, path)
    
    
    # Archimedische Spirale
def f(t): return t * math.sin(t)
def g(t): return t * math.cos(t)
'''

def f(t): return math.sin(4*t)
def g(t): return math.cos(3*t)

def evaluate(t):
    point = (f(t),g(t),0)
    print("Parametric function is evaluated at t = ",t)
    print("Resulting point is at: ",point)
    rs.AddPoint(point)
    
for i in range(20):
    evaluate(i)

def graph(t0,t1,dt):
    points = []
    t = t0
    while t <= t1:
        points.append((f(t),g(t),0))
        evaluate(t)
        t = t + dt
    points.append((f(t1),g(t1),0))
    rs.AddPolyline(points)
    print("Domain of t is ",t0," to ",t1)
    print("Number of samples used:",len(points))

    return points
