# -*- coding: utf-8 -*-
print "- so funktionieren auch umläute und scharfe ßes und ^ UND ° \n- aber das wollen wir ja eigentlich gar nicht :)\n"


#####################################
### DM2_w22 # AGruber@tugraz.at   ###
### ue_02_demo_01 # alice_and_bob ###
#####################################

##############################
import rhinoscriptsyntax as rs
import random
##############################

rs.UnitSystem(4)                        # meters = 4, cm = 3, etc ### check coding etc ä ß °°^^
rs.ShowGrid(view=None, show=0)
rs.ShowGridAxes(view=None, show=1)
rs.EnableRedraw(1)
rs.ViewDisplayMode(view=None, mode="Ghosted", return_name=True)
rs.Command("-printDisplay State=On enter", 0)

rs.ShowObjects(rs.AllObjects())
rs.DeleteObjects( rs.AllObjects() )
rs.CurrentLayer("Default")


print "\t   ********\**/************"
print "\t  **********\/entanglement"
print "\t my quantum /\***********"
print "\t***********/**\*********\n\n",



layNam = "MY_SETUP"
rs.CurrentLayer(rs.AddLayer(layNam))
rs.LayerPrintColor(layNam, [100,100,100])
rs.LayerPrintWidth(layNam, 1.0)

#______base vectors
p0 = [ random.uniform(-100,100), random.uniform(-100,100), random.uniform(-150,-100) ]
p1 = [ random.uniform(-100,100), random.uniform(-100,100), random.uniform( 100, 150) ]

def mySquare( a=random.uniform(50,300), p1=p1 ):
    a0=[0,0,0]
    a1=[a,0,0]
    a2=[a,a,0]
    a3=[0,a,0]
    cen = [a*.5, a*.5, 0]
    coords_a = [a0,a1,a2,a3, a0]
    #rs.AddCurve(coords_a, 1)
    #rs.AddPoint( cen )
    rotXYZ = [ random.uniform(-30,30), random.uniform(-30,30), random.uniform(-30,30) ]
    #for i in range( len(coords_a) ): coords_a[i] = rs.VectorRotate(coords_a[i], 30, rotXYZ)
    #rs.ObjectColor(rs.AddCurve(coords_a, 1), [200,200,0])
    #rs.ZoomExtents()

    rotXYZ = [ random.uniform(-30,30), random.uniform(-30,30), random.uniform(-30,30) ]
    for i in range( len(coords_a) ): coords_a[i] = rs.VectorAdd(coords_a[i], p1)
    for i in range( len(coords_a) ): coords_a[i] = rs.VectorRotate(coords_a[i], 30, rotXYZ)
    #rs.ObjectColor(rs.AddCurve(coords_a, 1), [200,200,0])
    #rs.ZoomExtents()
    return coords_a

def setUp(coords_a, coords_b, dele=1):
    global bob
    global ali
    rs.AddCurve( coords_a, 1 )
    rs.AddCurve( coords_b, 1 )
    
    rs.ZoomExtents()
    
    rects = rs.AllObjects()
    colors = [[200,200,0], [0,200,200]]
    random.shuffle(rects)
    random.shuffle(colors)
    
    ali = rects[0]
    rs.ObjectName(ali, "ali")
    rs.ObjectPrintColor(ali, colors[0])
    coords_a = rs.CurvePoints(ali)[0:-1]
    bob = rects[1]
    rs.ObjectName(bob, "bob")
    rs.ObjectPrintColor(bob, colors[1])
    coords_b = rs.CurvePoints(bob)[0:-1]
    
    rs.ObjectColor(rs.AddPlanarSrf(ali), colors[0])
    rs.ObjectColor(rs.AddPlanarSrf(bob), colors[1])
    
    #for i,cor in enumerate(coords_a): rs.AddTextDot("b_"+str(i), cor)
    for i,cor in enumerate(coords_a):
        rs.AddTextDot("a_"+str(i), cor)
        rs.AddTextDot("b_"+str(i), coords_b[i])
        #rs.AddLine(coords_a[i], coords_b[i])
    
    allCoords = rs.CurvePoints(ali)+rs.CurvePoints(bob)
    for deg in range(2,9):
        rs.AddCurve(allCoords, deg)
    if dele:
        for deg in range(2,9): random.shuffle(allCoords); rs.AddCurve(allCoords, deg)
    
    #listSorted = sorted(list2sort, key=lambda entry: entry[1]) 
    if dele:
        for obj in rs.AllObjects()[0:-2]:
            rs.DeleteObject(obj)
            rs.ZoomExtents()
            rs.Sleep(10)


coords_a = mySquare(random.uniform(50,300), p0)
coords_b = mySquare(random.uniform(50,300), p1)
#rs.AddPoints( coords_a+coords_b )
#for i in range(4): rs.AddLine( coords_a[i], coords_b[i] ) 

setUp(coords_a, coords_b, dele=1)



##############################here you go:
##########################################
##########################################
layNam = "MY_PROJECT"
rs.CurrentLayer(rs.AddLayer(layNam))
rs.LayerPrintColor(layNam, [100,100,100])
#rs.HideObjects(rs.AllObjects() )

#rs.DeleteObjects( rs.AllObjects() )
#rs.AddLine( coords_a[0], coords_b[0])
rs.EnableRedraw(0)
if 0:
    anz =100
    pot =  3
    #coords = rs.DivideCurve(bob, anz, 0, 1)
    coords = coords_b[0:4]
    bobCoords = []
    while len(bobCoords) < 8**pot:
        p0 = random.choice(coords)
        p1 = random.choice(coords)
        if rs.Distance(p0, p1)*0.9 > rs.Distance(coords[0], coords[1]):
            #lin = rs.AddLine(p0, p1)
            vec_p0_p1 = rs.VectorSubtract(p1, p0)
            vecScaled = rs.VectorScale( vec_p0_p1, random.uniform(0,1) )
            pX = rs.VectorAdd(p0, vecScaled)
            #rs.AddPoint( pX )
            bobCoords.append(pX)
    
    #coords = rs.DivideCurve(ali, anz, 0, 1)
    coords = coords_a
    aliCoords = []
    while len(aliCoords) < 8**pot:
        p0 = random.choice(coords)
        p1 = random.choice(coords)
        if rs.Distance(p0, p1)> 1 and rs.Distance(p0, p1) < rs.Distance(coords[0], coords[2]*0.9):
            #lin = rs.AddLine(p0, p1)
            vec_p0_p1 = rs.VectorSubtract(p1, p0)
            vecScaled = rs.VectorScale( vec_p0_p1, random.uniform(0,1) )
            pX = rs.VectorAdd(p0, vecScaled)
            #rs.AddPoint( pX )
            aliCoords.append(pX)
    rs.AddPoints( aliCoords+bobCoords )
    #aliX = rs.AddCurve( aliCoords, 1)
    #rs.DivideCurve(aliX, 1001, 1, 1)
    if 1:
        for i in range(1001):
            pA = random.choice(aliCoords)
            pB = random.choice(bobCoords)
            #rs.AddCurve( [pA, pB], 1)
            rs.AddCurve( [pA, [0,0,0], pB], 2)

rs.ZoomExtents()
rs.CurrentLayer("Default")








######################
#______4_lazy_experts:
if 0:
    import time
    rs.ZoomExtents()
    rs.Command("-zoom Factor 0.95 enter", 0)
    rs.Redraw()
    from datetime import datetime
    print str(datetime.now())[0:19]
    #print datetime.now().strftime('%a %b  / %d.%m.%Y um %Huhr und %Mmin und %Ssec')
    #print time.ctime()
    
    if 0: ### capture images to P:\
        path = "P:/ue_02/images/" ### if there is no folder like this: check your desktop 
        name = "tst"
        rs.Command("-viewCaptureToFile Width=480  Height=360  Scale=1.5 TransparentBackground=Yes "+path+name, 0)
        name = name+"_"+str(int(time.time()))+".jpg"
        rs.Command("-viewCaptureToFile Width=480  Height=360  Scale=2 DrawGrid=No  DrawWorldAxes=No  DrawCPlaneAxes=No TransparentBackground=No  "+path+name, 0)
        print path+name


