##############################
import rhinoscriptsyntax as rs
import random, time, sys   ###                                              
sys.path.append("P:/")     ### add path where "DM_lib.py" can be found !!!
sys.path.append("P:/WWW/tkonrad/DM2/")                                             
import DM_lib as dm        ### reload(dm)    
import Rhino
import scriptcontext as sc
############################## 

###################
#rs.ViewDisplayMode(view=None, mode="rendered")
#rs.EnableRedraw(0)
#dm.printDisplay(1)
#dm.newEmptyLayer("FIBONACCI::ADA", [0,0,0])
###################

dm.eA()

rs.Redraw()

n = 5
a = b = 1

fibReihe = [a,b]
for i in range(n):
    c = a+b
    a = b
    b = c
    fibReihe.append(c)
print "fibi =", fibReihe

for i,fibi in enumerate(fibReihe):
    rect = rs.AddRectangle([[0,0,0], [fibi,0,0], [0,fibi,0]], fibi, fibi)
    rs.RotateObject(rect, [0,0,0], -90, [0,0,1])
    rs.ObjectName( rect, "fibi_"+str(i) )
    if i:
        p0 = rs.CurveEditPoints(rs.ObjectsByType(4)[0])[(i-0)%4-0]
        p1 = rs.CurveEditPoints(rs.ObjectsByType(4)[1])[(i+1)%4-0]
        ##coords = rs.CurveEditPoints(rs.ObjectsByType(4)[0])
        ##print i, "..", fibi, "--", (i-0)%4, i%4, ".." ,
        ##print p0, p1, "__", rs.VectorSubtract(p1, p0)
        #rs.ObjectColor(rs.AddPoint(p0), [200,0,0])
        #rs.ObjectName( rs.AddPoint(p0), str(i))
        rs.MoveObject(rs.ObjectsByType(4)[0], rs.VectorSubtract(p1, p0))
        ##coords = rs.CurveEditPoints(rs.ObjectsByType(4)[0])
        #rs.AddCurve(coords[0:3], 2)
dm.zA()


fibis = rs.ObjectsByName("fibi_*", 1)
fibis.reverse()

print "len(fibis)", len(fibis)
rota = 0
spiraCoords=[]
floor = 10
base = []
top = []
top2 = []
base2 = []
div = 10-2^i
for i,crv in enumerate(fibis[1:]):
    coords = rs.CurveEditPoints(crv)
    p0 = dm.pnt2str( coords[0] )
    p1 = dm.pnt2str( coords[1] )
    p3 = dm.pnt2str( coords[3] )
    #p3 = rs.VectorAdd(p3, rs.VectorScale( dVec3, 500.0 ) )
    rs.Command("Arc "+str(p0)+" "+str(p1)+" "+str(p3)+" enter", 0)
#    rs.ObjectColor(rs.AllObjects()[0], [200,100,100])
    #rs.RotateObject(rs.AddCurve(coords[1:4], 2), dm.pntCentroid(coords[0:4]), rota)
    rs.RotateObject(rs.AllObjects()[0], dm.pntCentroid(coords[0:4]), rota+180*(0))
    rota += 90#*(i>0)
    coords = rs.CurveEditPoints(rs.AllObjects()[0])
    base_arc = rs.AddArc3Pt(coords[0], coords[2],  coords[1])
    base_arcOffset = rs.OffsetCurve( base_arc, [0,0,0], 0.0000001 )[0]
    coords_base_arc = rs.DivideCurve(base_arcOffset, div, 0)
    base.extend(coords_base_arc)
    
    coords[0][2]=fibReihe[i-0]
    coords[1][2]=fibReihe[i-0]+(fibReihe[i+1]-fibReihe[i-0])*0.5
    coords[2][2]=fibReihe[i+1]
#    top = rs.AddPoints( coords )
    top_arc = rs.AddArc3Pt(coords[0], coords[2],  coords[1])
    top_arcOffset = rs.OffsetCurve( top_arc, [0,0,0], 0.0000001 )[0]
    coords_top_arc = rs.DivideCurve(top_arcOffset, div, 0)
    rs.ObjectColor( top_arcOffset, [80,80,80])
    top.extend(coords_top_arc)
#    rs.DeleteObject(top_arc)
#    print " type(top_arc)", type(top_arc)

#    topOffset2 = rs.OffsetCurve( top_arc, [0,0,0], -4.0 )
#    coords_top_arc2 = rs.DivideCurve(topOffset2, div, 0)
#    top2.extend(coords_top_arc2)
#    rs.ObjectColor( topOffset2, [0,255,255])#cyan
#    coords2 = rs.CurveEditPoints(rs.AllObjects()[0])
#    top2 = rs.AddPoints( coords2 )

    i = 0
    coords[0][2]=i#fibReihe[i-0]
    coords[1][2]=i#fibReihe[i-0]+(fibReihe[i+1]-fibReihe[i-0])*0.5
    coords[2][2]=i#fibReihe[i+1]
#    rs.AddPoints(coords)
    arc = rs.AddArc3Pt(coords[0], coords[2], coords[1])
#    rs.OffsetCurve( top_arcOffset, [0,0,0], 1.0 )
#    coords3 = rs.CurveEditPoints(rs.AllObjects()[0])
#    coordsC0 = rs.DivideCurve(arc, 10, 0)
#    top3 = rs.AddPoints( coords3 )
    base2Offset = rs.OffsetCurve( arc, [0,0,0], -4.0 )
#    coords3 = rs.CurveEditPoints(rs.AllObjects()[0])
    coordsC2 = rs.DivideCurve(base2Offset, div, 0)
    base2.extend(coordsC2)
#    top3 = rs.AddPoints( coords3 )
#    top3C2 = rs.AddPoints( coordsC2 )

    if i==0:
        coords[0][2]=0
        coords[1][2]=0.5
        coords[2][2]=1
#    rs.AddArc3Pt(coords[0], coords[2], coords[1])
    rs.ObjectColor(rs.AllObjects()[0], [80,80,80])
    spiraCoords.extend( coords[1:3])

    
    rs.DeleteObject(base_arc)
    rs.DeleteObject(base_arcOffset)
    rs.DeleteObject(top_arc)
#    rs.DeleteObject(top_arcOffset)
rs.DeleteObjects(fibis)

#    print "base",base
#rs.ObjectColor(rs.AddCurve(base,1),[0,255,0])

baseCurve = rs.AddCurve(base,1)

rs.ObjectColor(baseCurve,[80,80,80])

print "len",rs.CurveLength(baseCurve)

#rs.AddCircle(base[0],1)
hoehe = 1
allCoords = []
lin_out_mids = []
anzSegments = 90 #oder 90

for i in range(40):
    pBase2 = base2[i]
    pTop = top[i]
    pBase = base[i]
    lin_out = rs.AddLine(pBase2,pTop) #Linie aussen
    lin_mid = rs.AddLine(pBase,pTop)
    vecRadial = rs.VectorUnitize(pBase)

    if hoehe == 15:
        hoehe = 15
    else:
        hoehe = hoehe + 0.2
    p1 = rs.VectorAdd(pBase, [0,0,hoehe])
    p1 = rs.VectorAdd(p1, rs.VectorScale(vecRadial, -i/40-2))#-i/40-5.0))
    p2 = rs.VectorAdd(pBase, [0,0,2])
    p2 = rs.VectorAdd(p2, rs.VectorScale(vecRadial, -i/40-1))#-i/40-2))
    lin_out = rs.AddLine(pBase2,pTop) #Linie aussen
    lin_out = rs.DivideCurve(lin_out, 10,0)
#    lin_out_mid = rs.VectorAdd(lin_out[5], rs.VectorScale(vecRadial, -3.0))
#    rs.AddPoint( lin_out_mid )
#    lin_out_mids.extend(lin_out_mid)
    crv = rs.AddCurve( [ pBase, p2, p1, pTop ], 2 )
    coords = rs.DivideCurve( crv, div, 0)
#    rs.ObjectColor( crv , [255,0,0] ) 
    rs.ObjectPrintWidth( crv , 0.05 )
    rs.DeleteObject( crv )
#    coords_2 = coords [1]
    allCoords.append( coords )
    
####
for i in range(40,60):
    pBase2 = base2[i]
    pTop = top[i]
    pBase = base[i]
    lin_out = rs.AddLine(pBase2,pTop) #Linie aussen
    lin_mid = rs.AddLine(pBase,pTop)
    vecRadial = rs.VectorUnitize(pBase)

    if hoehe == 15:
        hoehe = 15
    else:
        hoehe = hoehe + 0.2
    p1 = rs.VectorAdd(pBase, [0,0,hoehe])
    p1 = rs.VectorAdd(p1, rs.VectorScale(vecRadial, -i/20-3))#-i/40-5.0))
    p2 = rs.VectorAdd(pBase, [0,0,2])
    p2 = rs.VectorAdd(p2, rs.VectorScale(vecRadial, -i/20))
    lin_out = rs.AddLine(pBase2,pTop) #Linie aussen
    lin_out = rs.DivideCurve(lin_out, 10,0)
#    lin_out_mid = rs.VectorAdd(lin_out[5], rs.VectorScale(vecRadial, -3.0))
#    rs.AddPoint( lin_out_mid )
#    lin_out_mids.extend(lin_out_mid)
    crv = rs.AddCurve( [ pBase, p2, p1, pTop ], 2 )
    coords = rs.DivideCurve( crv, div, 0)
#    rs.ObjectColor( crv , [255,0,0] ) 
    rs.ObjectPrintWidth( crv , 0.05 )
    rs.DeleteObject( crv )
#    coords_2 = coords [1]
    allCoords.append( coords )


####
for i in range(60,90):#oder (40, 90)
    pBase = base[i]
    pTop = top[i]
    pBase2 = base2[i]
#    pTop2 = top2[i]
    vecRadial = rs.VectorUnitize(pBase)
    if hoehe == 15:
        hoehe = 15
    else:
        hoehe = hoehe + 0.2

    p1 = rs.VectorAdd(pBase, [0,0,hoehe])
    p1 = rs.VectorAdd(p1, rs.VectorScale(vecRadial, -6.0))
    p2 = rs.VectorAdd(pBase, [0,0,2])
    p2 = rs.VectorAdd(p2, rs.VectorScale(vecRadial, -3.0))
    lin_out = rs.AddLine(pBase2,pTop) #Linie aussen
    lin_out = rs.DivideCurve(lin_out, 10,0)
#    lin_out_mid = rs.VectorAdd(lin_out[5], rs.VectorScale(vecRadial, -3.0))
#    rs.AddPoint( lin_out_mid )
#    lin_out_mids.extend(lin_out_mid)
    crv = rs.AddCurve( [ pBase, p2, p1, pTop ], 2 )
    coords = rs.DivideCurve( crv, div, 0)
#    rs.ObjectColor( crv , [255,0,0] ) 
    rs.ObjectPrintWidth( crv , 0.05 )
    rs.DeleteObject( crv )
#    coords_2 = coords [1]
    allCoords.append( coords )
    
if 1: ### DM2_nerd^2 : AddArc3Pt
    for i in range( div-0 ):
#        zVal = allCoords[0][i][2]
#        pZ = [0,0,zVal]
#        rs.AddPoint( pZ )
        for j in range(anzSegments-0):
            p0 = allCoords[j%anzSegments][i]
            #Um Zacken herausstehen zu lassen
#            pout = rs.VectorAdd(p0, rs.VectorScale(vecRadial, -1.0))
            p1 = allCoords[j%anzSegments][i+1]
            p2 = allCoords[(j+1)%anzSegments][i+1]
            p3 = allCoords[(j+1)%anzSegments][i+0]
            pMid12 = dm.pntInbetween(p1,p2)
            pMid23 = dm.pntInbetween(p2,p3)
            pMid3 = dm.pntInbetween(pMid12,p3)
            pMid1 = dm.pntInbetween(pMid12,p0)
            pMid2 = dm.pntInbetween(pMid12,pMid1)
            pMid03 = dm.pntInbetween(p0,p3)
            pMid030 = dm.pntInbetween(pMid03,p0)
            pMid = dm.pntInbetween(p0,p2)
            pMid01 = dm.pntInbetween(p0,p1)
            pMid012 = dm.pntInbetween(p0,pMid12)
            pMid00 = dm.pntInbetween(p0,pMid012)
            pMid123 = dm.pntInbetween(pMid12,p3)
            pMid11 = dm.pntInbetween(pMid12,p1)
            if random.random() < 0.5: 
#                if j == 0:
#                    lin = rs.ObjectColor(rs.AddLine(p0,top[0]),[150,155,166])
                if j == 89:#89:
                    lin = rs.ObjectColor(rs.AddLine(p0,lin_out[0]),[80,80,80])
                else:
                    lin = rs.ObjectColor(rs.AddLine( p0, pMid12 ),[80,80,80])
                    lin = rs.ObjectColor(rs.AddLine(pMid12,p3),[80,80,80])
                    lin = rs.ObjectColor(rs.AddLine(p3,p0),[28,134,238])
                    lin = rs.ObjectColor(rs.AddLine(pMid3,pMid),[80,80,80])
                    lin = rs.ObjectColor(rs.AddLine(pMid,pMid030),[80,80,80])
                    lin = rs.ObjectColor(rs.AddLine(pMid,pMid2),[80,80,80])
                    lin = rs.ObjectColor(rs.AddLine(p1,p2),[28,134,238])
                    lin = rs.ObjectColor(rs.AddLine(pMid01,pMid00),[28,134,238])
                    lin = rs.ObjectColor(rs.AddLine(pMid23,pMid123),[28,134,238])
                    lin = rs.ObjectColor(rs.AddLine(pMid11,pMid01),[28,134,238])
            elif j == 89:#89: 
                lin = rs.ObjectColor(rs.AddLine(p0,lin_out[0]),[80,80,80])
            else:
                lin_re = rs.AddLine( p0, pMid12 )
                lin_base = rs.AddLine( p0, p3 )
                lin_div_re = rs.DivideCurve(lin_re,10,0)
                lin_div_base = rs.DivideCurve(lin_base,10,0)
                rs.AddLine( lin_div_re[9],lin_div_base[0])
                rs.AddLine( lin_div_re[8],lin_div_base[1])
                rs.AddLine( lin_div_re[7],lin_div_base[2])
                rs.AddLine( lin_div_re[6],lin_div_base[3])
                rs.AddLine( lin_div_re[5],lin_div_base[4])
                rs.AddLine( lin_div_re[4],lin_div_base[5])
                rs.AddLine( lin_div_re[3],lin_div_base[6])
                rs.AddLine( lin_div_re[2],lin_div_base[7])
                rs.AddLine( lin_div_re[1],lin_div_base[8])
                rs.AddLine( lin_div_re[0],lin_div_base[9])
                lin = rs.ObjectColor(rs.AddLine( p3, pMid12 ),[28,134,238])
                lin = rs.ObjectColor(rs.AddLine( p2, p1 ),[28,134,238])
                lin = rs.ObjectColor(rs.AddLine(pMid01,pMid00),[28,134,238])
                lin = rs.ObjectColor(rs.AddLine(pMid23,pMid123),[28,134,238])
                lin = rs.ObjectColor(rs.AddLine(pMid11,pMid01),[28,134,238])