print"      ADA Lovelace Fibonaccihaus mit ADA Fassade"
print"                                "
print "____________ $$$$$$$$$$$$"
print "_________ $$$$____________$$$"
print "_______ $$_____$$$$$$$$$_____$$"
print "_____ $$$____$$$$____$$$$______$$$"
print "____ $$_____$$$_________$$$_____$$"
print "____ $$____$$$___________$$$______$$$"
print "____ $_____$_____$$$$$_____$$______$$$"
print "____ $_____$$____$$__$_____$$$_____$$$$"
print "_____ $_____$$______$$_____$$$______$$"
print "______$ _____$$$___$$_____$$$$"
print "_______$ _______$$$______$$$"
print "________$$$$ __________$$$$"
print "                           "
print "DM2 Final Project by Tanja Konrad"

##############################
import rhinoscriptsyntax as rs
import random, time, sys, os   ###                                              
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.getCameraTarget()
dm.setCameraTarget( [-40.98986702, 10.95630827, 38.13359588], [5.4364466, 11.92821094, 2.88615249], lens=50.0, rota=0, upVec=[0.6044692058545058,0.012654143537115987,0.7965279981425418] ) # ... danke, andi !

rs.EnableRedraw(0) ### ag
#dm.eA()
rs.Redraw()

#Colors
#blau
blue = [28,134,238]
#grau
grey = [80,80,80]

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

origin = [0,0,0]

dm.newEmptyLayer("FIBI", [0,0,0])
#Fibonacci-Rechtecke und Kurven
for i,fibi in enumerate(fibReihe):
    rect = rs.AddRectangle([origin, [fibi,origin[1],origin[2]], [origin[0],fibi,origin[2]]], fibi, fibi)
    rs.RotateObject(rect, origin, -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]
        rs.MoveObject(rs.ObjectsByType(4)[0], rs.VectorSubtract(p1, p0))

fibis = rs.ObjectsByName("fibi_*", 0) ### ag
fibis.reverse()

#print "len(fibis)", len(fibis)
rota = 0
spiraCoords=[]
floor = 10
base = []
top = []
top2 = []
base2 = []
div = 10-2^i
curveOffset = -4.0

path = "C:/DM2/DM2/anim-fibi/"
#path = "D:/animatzi/TU_tst/"
if not os.path.exists(path): os.makedirs(path)
framNumber=0
captureIt = 1
if 1:#Basiskurven
    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] )
        rs.Command("Arc "+str(p0)+" "+str(p1)+" "+str(p3)+" enter", 0)
        rs.RotateObject(rs.AllObjects()[0], dm.pntCentroid(coords[0:4]), rota+180*(0))
        rota += 90
        coords = rs.CurveEditPoints(rs.AllObjects()[0])
        base_arc = rs.AddArc3Pt(coords[0], coords[2],  coords[1])
        base_arcOffset = rs.OffsetCurve( base_arc, origin, 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_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, grey)
        top.extend(coords_top_arc)

        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]
        arc = rs.AddArc3Pt(coords[0], coords[2], coords[1])
        base2Offset = rs.OffsetCurve( arc, origin, curveOffset )
        coordsC2 = rs.DivideCurve(base2Offset, div, 0)
        base2.extend(coordsC2)
    
        if i==0:
            coords[0][2]=0
            coords[1][2]=0.5
            coords[2][2]=1
        rs.ObjectColor(rs.AllObjects()[0], grey)
        spiraCoords.extend( coords[1:3])
    
        rs.DeleteObject(base_arc)
        rs.DeleteObject(base_arcOffset)
        rs.DeleteObject(top_arc)
    rs.DeleteObjects(fibis)
    
    baseCurve = rs.AddCurve(base,1)
    
    rs.ObjectColor(baseCurve,grey)
    
#    print "len",rs.CurveLength(baseCurve)
    
    hoehe = 1
    allCoords = []
    lin_out_mids = []
    anzSegments = 90
    seg_innen = 40
#Fassadengeruest innere Schnecke
#Unterscheidung innen-aussen damit innen nicht soviel auskragt
    for i in range(seg_innen): 
        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-5.0))
        p2 = rs.VectorAdd(pBase, [0,0,2])
        p2 = rs.VectorAdd(p2, rs.VectorScale(vecRadial, -i/40-2))
        lin_out = rs.AddLine(pBase2,pTop) #Linie aussen
        lin_out = rs.DivideCurve(lin_out, 10,0)
        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 )
        allCoords.append( coords )
#Fassadengeruest weiter aussen
    for i in range(seg_innen,anzSegments):
        pBase = base[i]
        pTop = top[i]
        pBase2 = base2[i]
        anzfotos = 14
        vecRadial = rs.VectorUnitize(pBase)
        if hoehe == 15:
            hoehe = 15
        else:
            hoehe = hoehe + 0.2
        woelbung1 = -6.0
        woelbung2 = -3.0
        p1 = rs.VectorAdd(pBase, [0,0,hoehe])
        p1 = rs.VectorAdd(p1, rs.VectorScale(vecRadial, woelbung1))
        p2 = rs.VectorAdd(pBase, [0,0,2])
        p2 = rs.VectorAdd(p2, rs.VectorScale(vecRadial, woelbung2))
        lin_out = rs.AddLine(pBase2,pTop) #Linie aussen
        lin_out = rs.DivideCurve(lin_out, 10,0)
        crv = rs.AddCurve( [ pBase, p2, p1, pTop ], 2 )
        coords = rs.DivideCurve( crv, div, 0)
        rs.ObjectPrintWidth( crv , 0.05 )
        rs.DeleteObject( crv )
        allCoords.append( coords )
        
    if 1: ### DM2_nerd^2 : AddArc3Pt
        for i in range( anzfotos-0 ):
            rs.Redraw()
            nam = dm.makeName("FIBI", frameNumber=framNumber, anzahl=4, format='jpg')
            if captureIt:
                rs.Command("-viewCaptureToFile Width=960 Height=540 Scale=2 DrawCPlaneAxes=No TransparentBackground=No "+path+nam+" ", 0)
            framNumber +=1
#ADA Fassade
            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 == anzSegments-1:#89:
                        lin = rs.ObjectColor(rs.AddLine(p0,lin_out[0]),grey)
                    else:
                        lin = rs.ObjectColor(rs.AddLine( p0, pMid12 ),grey)
                        lin = rs.ObjectColor(rs.AddLine(pMid12,p3),grey)
                        lin = rs.ObjectColor(rs.AddLine(p3,p0),blue)
                        lin = rs.ObjectColor(rs.AddLine(pMid3,pMid),grey)
                        lin = rs.ObjectColor(rs.AddLine(pMid,pMid030),grey)
                        lin = rs.ObjectColor(rs.AddLine(pMid,pMid2),grey)
                        lin = rs.ObjectColor(rs.AddLine(p1,p2),blue)
                        lin = rs.ObjectColor(rs.AddLine(pMid01,pMid00),blue)
                        lin = rs.ObjectColor(rs.AddLine(pMid23,pMid123),blue)
                        lin = rs.ObjectColor(rs.AddLine(pMid11,pMid01),blue)
                elif j == anzSegments-1:#89:
                    lin = rs.ObjectColor(rs.AddLine(p0,lin_out[0]),grey)
                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)
                    for a in range(0,10):
                        rs.AddLine( lin_div_re[9-a],lin_div_base[a])
                    lin = rs.ObjectColor(rs.AddLine( p3, pMid12 ),blue)
                    lin = rs.ObjectColor(rs.AddLine( p2, p1 ),blue)
                    lin = rs.ObjectColor(rs.AddLine(pMid01,pMid00),blue)
                    lin = rs.ObjectColor(rs.AddLine(pMid23,pMid123),blue)
                    lin = rs.ObjectColor(rs.AddLine(pMid11,pMid01),blue)

#posInLondon = [-14593.209,69045.226]

allFibiObjects = rs.ObjectsByLayer("FIBI", 0)
#movVec =rs.VectorSubtract(posInLondon, [0,0,0] )
#print movVec
#rs.MoveObjects(allFibiObjects, movVec)

#rs.AddLine( [0,0,0], posInLondon )
